ホームページ >バックエンド開発 >Golang >Go JSON でスネークケースキーをキャメルケースに変換するにはどうすればよいですか?

Go JSON でスネークケースキーをキャメルケースに変換するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-28 12:07:01829ブラウズ

How to Convert Snake Case Keys to Camel Case in Go JSON?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。