Ada sebuah beberapa pertanyaan pada topik namun tidak satupun dari mereka tampaknya untuk menutupi kasus saya, sehingga saya membuat yang baru.
Saya memiliki JSON seperti berikut:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
Apakah ada cara untuk membatalkan penguraian properti nested bar dan menetapkannya langsung ke properti struct tanpa membuat struct bersarang?
Solusi yang saya adopsi saat ini adalah sebagai berikut:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
Ini adalah versi yang disederhanakan, harap abaikan verbositasnya. Seperti yang Anda lihat, saya ingin dapat mengurai dan menetapkan nilainya
// FooBar string `json:"foo.bar"`
Saya telah melihat orang-orang menggunakan peta, tetapi itu bukan kasus saya. Saya pada dasarnya tidak peduli tentang konten foo
(yang merupakan objek besar), kecuali untuk beberapa elemen tertentu.
Apa pendekatan yang benar dalam kasus ini? Saya tidak mencari peretasan aneh, jadi jika ini cara yang harus dilakukan, saya baik-baik saja dengan itu.
Seperti yang disebutkan Volker, struct bersarang adalah cara yang tepat. Tetapi jika Anda benar - benar tidak ingin struct bersarang, Anda dapat mengganti fungsi UnmarshalJSON.
https://play.golang.org/p/dqn5UdqFfJt
Harap abaikan fakta bahwa saya tidak mengembalikan kesalahan yang semestinya. Saya meninggalkannya untuk kesederhanaan.
UPDATE: Mengambil nilai "lebih" dengan benar.
sumber
Ini adalah contoh cara membatalkan respons JSON dari server proxy sbserver Safebrowsing v4 API: https://play.golang.org/p/4rGB5da0Lt
sumber
Iya. Dengan gjson, yang harus Anda lakukan sekarang adalah:
bar := gjson.Get(json, "foo.bar")
bar
bisa menjadi properti struct jika Anda mau. Juga, tidak ada peta.sumber
fastjson.GetString(json, "foo", "bar")
Bagaimana dengan bidang anonim? Saya tidak yakin apakah itu akan membentuk "struct bersarang" tapi itu lebih bersih daripada memiliki deklarasi struct bersarang. Bagaimana jika Anda ingin menggunakan kembali elemen bersarang di tempat lain?
sumber
Tetapkan nilai bersarang
json
ke struct sampai Anda mengetahui jenis kunci json yang mendasarinya: -sumber
Saya sedang mengerjakan sesuatu seperti ini. Tetapi bekerja hanya dengan struktur yang dihasilkan dari proto. https://github.com/flowup-labs/grpc-utils
dalam proto Anda
Maka output Anda akan menjadi
sumber
Menggabungkan peta dan struct memungkinkan unmarshaling objek JSON bertingkat di mana kuncinya dinamis. => peta [string]
Contoh: stock.json
Buka aplikasi
Kunci dinamis dalam hash menangani string, dan objek bertingkat diwakili oleh sebuah struct.
sumber