亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從嵌套的 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條經驗 獲得超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)

}


查看完整回答
反對 回復 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 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號