2 回答
TA贡献1821条经验 获得超4个赞
无论如何,您为什么要解组到地图并进行类型检查?
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 关注
- 161 浏览
添加回答
举报