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

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

解組具有多種值類型和任意數量鍵的 JSON

解組具有多種值類型和任意數量鍵的 JSON

Go
慕碼人8056858 2022-11-23 15:52:19
我正在嘗試讀取具有以下形式的 JSON{  string: int,  string: string,  string: MyStruct,  string: MyStruct,  ...  string: MyStruct,}例如{  "status": 200,  "message": "some cool text",  "coolKeyA": {    "name": "yoda",    "age": 900   },  "CoolKeyB": {    "name": "Mahalalel",    "age": 895   },   "CoolKeyC": {    "name": "Prince",    "age": 57   },}期望的結果是獲得 的地圖map[string]MyStruct。有彈性或任意數量的“CoolKeyX”鍵,但其他鍵是靜態的,例如狀態和消息。由于 JSON 中的值是不同的類型,我試圖將它們放入空白map[string]interface{}中。然后目標是遍歷鍵并取出它們感興趣的鍵并將鍵轉換map[string]inferface{string: string, string: int}為 MyStruct。scaryAcceptAll := map[string]interface{}{}  if err = json.Unmarshal(byteArray, &scaryAcceptAll); err != nil {     log.Printf("error: %v", err)    return err   }     for k,v := range scaryAcceptAll {     if (k == "val0" ) || (k == "val1") {        continue    }       desiredMap[k] = models.MyStruct{Name: v["name"], Age: v["age"]}  }這給了我以下錯誤:NonIndexableOperand: invalid operation: cannot index v (variable of type interface{})我知道解組 JSON 的基本思想是創建一個看起來像 json 的結構并使用它但是因為我不知道鍵的確切數量或“CoolKey”鍵的真正含義(因為它是一個包含哈希的字符串“000ab8f26d”)我不知道怎么做。我知道接口有點像包羅萬象,但我不確定如何從中提取我想要的數據。
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

一種方法是實施自定義json.Unmarshaler

type Obj struct {

    Status   int

    Message  string

    CoolKeys map[string]Person

}


type Person struct {

    Name string

    Age  int

}

func (o *Obj) UnmarshalJSON(data []byte) error {

    // first, unmarshal the object into a map of raw json

    var m map[string]json.RawMessage

    if err := json.Unmarshal(data, &m); err != nil {

        return err

    }


    // next, unmarshal the status and message fields, and any

    // other fields that don't belong to the "CoolKey" group

    if err := json.Unmarshal(m["status"], &o.Status); err != nil {

        return err

    }

    delete(m, "status") // make sure to delete it from the map

    if err := json.Unmarshal(m["message"], &o.Message); err != nil {

        return err

    }

    delete(m, "message") // make sure to delete it from the map


    // finally, unmarshal the rest of the map's content

    o.CoolKeys = make(map[string]Person)

    for k, v := range m {

        var p Person

        if err := json.Unmarshal(v, &p); err != nil {

            return err

        }

        o.CoolKeys[k] = p

    }

    return nil

}

https://go.dev/play/p/s4YCmve-pnz


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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