猿问

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

这是我拥有的 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 {}


蛊毒传说
浏览 163回答 2
2回答

收到一只叮咚

无论如何,您为什么要解组到地图并进行类型检查?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 Modelif 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)}

慕标琳琳

根据发布的内容,我很清楚您在从嵌套的 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结构的字段提供的内容。如果编码的数据没有我们提供的标签,则不会对数据进行相应的解码。因此,将数据从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}]}
随时随地看视频慕课网APP

相关分类

Go
我要回答