[英]Unmarshalling json into a Golang struct with a map of structs which contains a map of structs
我很確定這可以通過多個結構來完成(有些是沒有地圖的臨時結構),但我不確定是否有更好的做事方式。
基本上說我有以下結構:
type Event struct {
Markets map[string]Market
}
type Market struct {
Products map[string]Product
}
type Product struct {
ID int
// etc ...
}
我需要將 json 解組到Events
object 中。
如果Markets
map 不包含Products
map,我會這樣做:
var markets map[string]Market
markets = make(map[string]Market)
var e Event
e.Markets = markets
e := json.Unmarshal([]byte(jsonString), &e)
但是,對於每個市場,我還需要make()
一個產品,並且對於每個產品,我可能需要創建更多的地圖等。
我可以使用一個臨時結構來解決這個問題,循環遍歷每個鍵調用make()
(見下面的例子),但這感覺有點混亂,我很確定 golang 會有一個更干凈的解決方案。
type TmpEvent struct {
Markets map[string]TmpMarket
}
type TmpMarket struct {
// No map here, could be empty struct
}
var events Event
var e TmpEvent
var TmpMarkets map[string]TmpMarket
TmpMarkets = make(map[string]TmpMarket)
e.Markets = TmpMarket
e := json.Unmarshal([]byte(jsonString), &e)
for k, _ := range e {
events[k].Market = make(map[string]Market)
}
// same for Product
// Then we can finally Unmarshal into original `Event` struct
抱歉,如果它之前已回答,但我找不到任何東西。
如果您只是想將數據解組為 Go 結構,則可以使用以下方法:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type (
Event struct {
Markets map[string]Market
}
Market struct {
Products map[string]Product
}
Product struct {
ID int
}
)
func main() {
content, err := ioutil.ReadFile("./data.json")
if err != nil {
panic(err)
}
var event Event
if err := json.Unmarshal(content, &event); err != nil {
panic(err)
}
fmt.Printf("%+v\n", event)
}
鑒於此data.json
作為輸入:
{
"markets": {
"foo": {
"products": {
"widget": {
"id": 1
},
"gizmo": {
"id": 2
}
}
},
"bar": {
"products": {
"doodad": {
"id": 3
},
"thingy": {
"id": 4
}
}
}
}
}
上面的代碼輸出:
{Markets:map[bar:{Products:map[doodad:{ID:3} thingy:{ID:4}]} foo:{Products:map[gizmo:{ID:2} widget:{ID:1}]}]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.