Go で JSON のスネークケースキーをキャメルケースに変換する
質問:
JSON 内のスネークケース キーをキャメルケース キーに再帰的に変換するにはどうすればよいでしょうか?これは、主要な形式が異なる可能性がある Elasticsearch などのデータストアからデータを受信する際に、API 応答 JSON を内部標準に合わせる場合に特に関係します。
回答:
これを実現するには変換するには、いくつかのアプローチを活用できます。効果的な方法の 1 つは、別個のフィールド タグを持つ 2 つの構造体を定義する Go 1.8 の機能を利用します。タグを慎重に作成することで、2 つの構造体間の変換を簡単に行うことができ、目的のキー変換を効果的に適用できます。
タグを使用したコード例:
<code class="go">package main import ( "encoding/json" "fmt" ) type ESModel struct { AB string `json:"a_b"` } type APIModel struct { AB string `json:"aB"` } func main() { b := []byte(`{ "a_b": "c" }`) var x ESModel json.Unmarshal(b, &x) b, _ = json.MarshalIndent(APIModel(x), "", " ") fmt.Println(string(b)) }</code>
再帰的マップベースのアプローチ:
もう 1 つの包括的な戦略には、JSON ドキュメントをマップにアンマーシャリングする試みが含まれます。操作が成功した場合は、系統的にキーを修正し、マップ値ごとにキー変換関数を再帰的に実行できます。次の例は、すべてのキーを大文字に変換する方法を示しています。実装では、fixKey 関数をsnake_case 変換関数に置き換える必要があります。
<code class="go">package main import ( "bytes" "encoding/json" "fmt" "strings" ) func main() { // Document source as returned by Elasticsearch b := json.RawMessage(`{ "a_b": "c", "d_e": ["d"], "e_f": { "g_h": { "i_j": "k", "l_m": {} } } }`) x := convertKeys(b) buf := &bytes.Buffer{} json.Indent(buf, []byte(x), "", " ") fmt.Println(buf.String()) } func convertKeys(j json.RawMessage) json.RawMessage { m := make(map[string]json.RawMessage) if err := json.Unmarshal([]byte(j), &m); err != nil { // Not a JSON object return j } for k, v := range m { fixed := fixKey(k) delete(m, k) m[fixed] = convertKeys(v) } b, err := json.Marshal(m) if err != nil { return j } return json.RawMessage(b) } func fixKey(key string) string { return strings.ToUpper(key) }</code>
以上がGo JSON でスネークケースキーをキャメルケースに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。