🐵

Jsonデータを構造体に定義してない部分も取得したい Go

2022/01/05に公開約1,200字

データをjsonで返すときに動的にフィールドへ追加するのはどうするのか調べたのでメモ

例えば

type Struct struct {
   Value_first  string `json:"value"`
   Value_second string `json:"value_one"`
   Nest         Nested `json:"nest"`
}

これでjson.Marshalしても定義以外はスルーして上3つしか返してくれません。
他も追加したいときの方法として一例を挙げます

import 	"encoding/json"

type FakeStruct struct
func (s Struct) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
    FakeStruct
        AddData map[string]string `json:"add_data"`
    }{
        FakeStruct: FakeItem(s),
        AddData: map[string]string{"something": "something"},
    })
}

これで以下のようにすればAddDataの部分が追加されてると思います

out, err := json.MarshalIndent(struct, "", "  ")
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(string(out))

他にも関数内で直接struct定義するやり方もあるっぽいです

    func (s Struct) MarshalJSON() ([]byte, error) {
        return struct {
            FakeStruct
            NewStruct struct {
                AddData string `json:"add_data"`
            } `json:"new_struct"`
        }{
            FakeStruct: FakeStruct(*s),
            NewStruct: struct {
                AddData string `json:"add_data"`
            }{
                AddData: "yes!",
            },
        }
    })

一応stack overflowを参考にはしてるんですけど、どれも5年前以上なのが気になる,,

Discussion

ログインするとコメントできます