GoでのJSON Marshalを使用した小文字のJSONキー名


175

"encoding/json"パッケージを使用して、アプリケーションのインポートされたパッケージの1つで宣言された構造体をマーシャリングしたいと思います。

例えば。:

type T struct {
    Foo int
}

インポートされるため、構造体で使用可能な(エクスポートされた)フィールドはすべて大文字で始まります。しかし、私は小文字のキー名が欲しいです:

out, err := json.Marshal(&T{Foo: 42})

結果として

{「フー」:42}

でも欲しい

{"foo":42}

問題を簡単な方法で回避することは可能ですか?


5
@Zippoxer:私は言うでしょう:小文字に厳密に定義されたクライアント/サーバー通信プロトコルのキー。まあ、私の場合、自分でプロトコルを定義しているので問題ではありませんが、少なくとも理論的には?しかし、それは主に私が愚かな細部にあまりにも多くの時間を費やしているだけであることを知っています。
ANisus

謝らないでください。あなたは愚かな人ではありません、完全なjson仕様を受け入れない言語は愚かなものです(以下のように問題は簡単に解決されます)。
ジャハーン

@ANisus:私は、JSONキー名ではなく、構造体キー名についての質問を誤解しています。投票を撤回しました。
Flimzy

回答:


265

encoding / json.Marshalのドキュメントをご覧ください。構造体フィールドタグを使用して、生成されたjsonのフォーマット方法を決定する方法について説明します。

例えば:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

これにより、次のようにJSONが生成されます。

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
フィールドタグ?ああ、私のドキュメントを検索するときに、この部分全体を逃しました。フラグ、関数、その他の設定を探していました。まあ、これは私が探していた正確な答えです!そしてさらに、私は学ぶために新しいGoの概念を持っています:フィールドタグ:)
ANisus '27

彼らは非常に便利です。reflectパッケージを介して実行時にそれらにアクセスできます。
2012

ええ、リフレクションで作業しているとき、フィールドにメタデータを追加する方法があることはすばらしいことです。ところで、答えを試してみました。魅力のように機能します。
ANisus

5
私はgo言語の呪いを始めたばかりです-これがどれほど愚かで、なぜ生成されたJSONなどでフィールドを小文字で作成するのでしょうか。その後、このスレッドに出くわし、「OMGそれは素晴らしい!!!」と思いました。私はジャンプして私のガールフレンドになぜ私がそんなに興奮しているのか説明しました:Dそれはとてもクールです:)))
nyxz

11
コロンとタグの最初の引用符の間にスペースがないことを確認してください!のjson:"some_tag"代わりに使用しますjson: "some_tag"。しばらくこれに気づきました。
David Morales

8

エクスポートするキーを使用して独自の構造体を作成し、小文字の名前に適切なjsonタグを付けることができます。次に、JSONとしてエンコードする前に、目的の構造体をコピーします。または、ローカル構造体の作成に煩わされたくない場合は、おそらくを作成しmap[string]interface{}てエンコードできます。


ばかげたことは、他のパッケージ(タイプを含む)も実際に私のものであるということです。しかし、はい、私はおそらくそれが構造体でなければならないという事実を盲目的に凝視しました。map[string]interface{}ネストされたオブジェクト/構造体で終わらない限り、a を使用しても機能します
ANisus

1
@ANisus:ああ、私の答えは、あなたが構造体の定義を制御できないことに基づいていました。jimtの答えは間違いなくあなたが望むものです。
リリーバラード

ええ、それが外部パッケージかどうかははっきりしませんでした。しかし、あなたの答えは、あなたが定義を制御していない場合でも、関連性があり有用です。
ANisus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.