次のコードスニペットを記述したとします。遊び心のある方のための完全なコードがここにあります。
type Book struct {
Title string
Author string
}
func main() {
ms := Book{"Catch-22", "Joseph Heller"}
out, err := json.MarshalIndent(ms, "", " ")
if err != nil {
log.Fatalln(err)
}
fmt.Println(string(out))
}
このコードは、期待どおりに以下を出力します。
{
"Title": "Catch-22",
"Author": "Joseph Heller"
}
しばらくの間、Book
構造体に含めずにフィールドをJSON出力に追加したいとします。おそらくジャンル:
{
"Title": "Catch-22",
"Author": "Joseph Heller",
"Genre": "Satire"
}
を使用MarshalJSON()
して、JSONペイロードに任意のフィールドを追加できますMarshal()
か?何かのようなもの:
func (b *Book) MarshalJSON() ([]byte, error) {
// some code
}
他の答えはこれは可能であるはずだと私に思わせますが、実装を理解するのに苦労しています。
これが私の以前の答えよりも良い答えです。
type FakeBook Book
func (b Book) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
FakeBook
Genre string
}{
FakeBook: FakeBook(b),
Genre: "Satire",
})
}
匿名構造体フィールドは「マージ」されるため(いくつかの追加の考慮事項があります)、それを使用して、個々のフィールドの再マッピングを回避できます。FakeBook
タイプを使用して、他の方法で発生する無限の再帰を回避することに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加