2 回答

TA貢獻1821條經驗 獲得超5個贊
無論如何,您為什么要解組到地圖并進行類型檢查?
type Model struct {
Id string `json:"Id"`
Name string `json:"ModelName"`
RelatedItems []RelatedItems `json:"RelatedItems"`
}
type RelatedItems struct {
RId string `json:"PCId"`
RName string `json:"PCName"`
RChildren string `json:"string"`
}
s := `{"Id": "ABC123",
"Name": "Hello",
"RelatedItems":[
{"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
{"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
}`
var result Model
if err := json.Unmarshal([]byte(s), &result); err != nil {
log.Fatal(err.Error())
}
fmt.Println("Id: ", result.Id)
for index, ri := range result.RelatedItems {
fmt.Printf("Key: %d\n", index)
fmt.Printf("RID: %s\n", ri.RId)
}

TA貢獻1830條經驗 獲得超9個贊
根據發布的內容,我很清楚您在從嵌套的 JSON 字符串中檢索數據時遇到問題。
我已經獲取了您的代碼并嘗試編譯和重現該問題。觀察后,根據代碼的編寫方式,我有幾點建議。
當
s
已知 中存在的數據類型與類型相似時Model
,result
可以將 聲明為type Model
。這導致var result Model
而不是map[string]interface{}
.interface{}
當不知道要從中解碼的數據時,可以使用switch
來拯救而不會使代碼崩潰。類似于:switch dataType := result["RelatedItems"].(type){ case interface{}: // Handle interface{} case []map[string]interface{}: // Handle []map[string]interface{} default: fmt.Println("Unexpected-Datatype", dataType) // Handle Accordingly
當我們嘗試 Unmarshal 時,我們確保查看為
json tags
結構的字段提供的內容。如果編碼的數據沒有我們提供的標簽,則不會對數據進行相應的解碼。因此,將數據從s
into解碼的結果result
將導致字段、、、{ABC123 [{ } { }]}
的標簽分別給出為、、。Name
RId
RName
RChildren
ModelName
PCId
PCName
string
通過上述建議并改進給定的標簽,這段代碼將如下所示,它肯定會從嵌套的 JSON 結構中檢索數據。
s := string(`{"Id": "ABC123",
"Name": "Hello",
"RelatedItems":[
{"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
{"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
}`)
var result Model
json.Unmarshal([]byte(s), &result)
fmt.Println(result)
type Model struct {
Id string `json:"Id"`
Name string `json:"Name"`
RelatedItems []RelatedItems `json:"RelatedItems"`
}
type RelatedItems struct {
RId string `json:"RId"`
RName string `json:"RName"`
RChildren string `json:"RChildren"`
}
這導致輸出:{ABC123 Hello [{TEST123 TEST1 Ch1} {TEST234 TEST2 Ch2}]}
- 2 回答
- 0 關注
- 190 瀏覽
添加回答
舉報