为了账号安全,请及时绑定邮箱和手机立即绑定

从嵌套的 JSON 字符串中检索元素

从嵌套的 JSON 字符串中检索元素

Go
蛊毒传说 2022-05-18 14:31:42
这是我拥有的 Go 代码:func main(){    s := string(`{"Id": "ABC123",                  "Name": "Hello",                   "RelatedItems":[                         {"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},                         {"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]                  }`)    var result map[string]interface{}    json.Unmarshal([]byte(s), &result)    fmt.Println("Id:", result["Id"])    Rlist := result["RelatedItems"].([]map[string]interface{})    for key, pist := range pist {        fmt.Println("Key: ", key)        fmt.Println("RID:", pist["RId"])    }}结构在下面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"`}我将如何获得可以让我从上面选择特定字段的输出?例如:输出ID:ABC123 键:0 RID:TEST123 键:1 RID:TEST234我看到这个错误恐慌:接口转换:接口 {} 为 nil,而不是 []map[string]interface {}
查看完整描述

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)

}


查看完整回答
反对 回复 2022-05-18
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

根据发布的内容,我很清楚您在从嵌套的 JSON 字符串中检索数据时遇到问题。

我已经获取了您的代码并尝试编译和重现该问题。观察后,根据代码的编写方式,我有几点建议。

  1. s已知 中存在的数据类型与类型相似时Modelresult可以将 声明为type Model。这导致var result Model而不是map[string]interface{}.

  2. 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

  3. 当我们尝试 Unmarshal 时,我们确保查看为json tags结构的字段提供的内容。如果编码的数据没有我们提供的标签,则不会对数据进行相应的解码。因此,将数据从sinto解码的结果result将导致字段、、、{ABC123  [{  } {  }]}的标签分别给出为、、。NameRIdRNameRChildrenModelNamePCIdPCNamestring

通过上述建议并改进给定的标签,这段代码将如下所示,它肯定会从嵌套的 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}]}


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信