スティーブンの答えは完全です。余談ですが、json で小文字のキーだけが必要な場合は、次のようにキー名を手動で指定できます。
type Whatever struct {
SomeField int `json:"some_field"`
}
このように、Whatever をマーシャリングすると、フィールド SomeField のキー「some_field」が生成されます (json に「SomeField」を含める代わりに)。
エクスポートされていないフィールドを保持することに固執している場合は、署名付きのメソッドを定義して json.Marshaler インターフェイスを実装することもできますMarshalJSON() ([]byte, error)
。これを行う 1 つの方法は、次のように、エクスポートされていないフィールドのバージョンを単にエクスポートした構造体リテラルを使用することです。
type Whatever struct {
someField int
}
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(struct{
SomeField int `json:"some_field"`
}{
SomeField: w.someField,
})
}
これは少し面倒な場合があるため、必要に応じて a を使用することもできmap[string]interface{}
ます。
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"some_field": w.SomeField,
})
}
ただし、マーシャリングinterface{}
にはいくつかの注意点がありuint64
、フロートへのマーシャリングなどを行うことができるため、精度が失われることに注意してください。(すべてのコードはテストされていません)