Go

在列表中使用不同类型去解组JSON

发布于 2021-02-01 11:10:06

我在解组JSON结构时遇到了麻烦:

{
  "id": 10,
  "result": [
    {
      "bundled": true,
      "type": "RM-J1100"
    },
    [
      {
        "name": "PowerOff",
        "value": "AAAAAQAAAAEAAAAvAw=="
      },
      {
        "name": "Input",
        "value": "AAAAAQAAAAEAAAAlAw=="
      }
    ]
  ]
}

我实际上需要结果中的第二个切片项。

我目前的尝试是

type Codes struct {
    Id     int32      `json:"id"`
    Result []interface{} `json:"result"`
}

type ResultList struct {
    Info  InfoMap
    Codes []Code
}

type InfoMap struct {
    Bundled bool   `json:"bundled"`
    Type    string `json:"type"`
}

type Code struct {
    Name  string `json:"name"`
    Value string `json:"value"`
}

输出是这样的:

{10 {{false } []}}

但是我也尝试使用这个:

type Codes struct {
    Id     int32      `json:"id"`
    Result []interface{} `json:"result"`
}

输出正常:

{10 [map[type:RM-J1100 bundled:true] [map[name:PowerOff value:AAAAAQAAAAEAAAAvAw==] map[name:Input value:AAAAAQAAAAEAAAAlAw==]]]}

我还可以引用Result [1]索引:

[map[name:PowerOff value:AAAAAQAAAAEAAAAvAw==] map[name:Input value:AAAAAQAAAAEAAAAlAw==]]

但是我无法将接口类型转换为任何其他匹配类型。谁能告诉我如何进行界面转换。哪种方法才是“最佳”。

关注者
0
被浏览
148
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    一种选择是将顶级事物解组为json.RawMessage最初的一部分。

    然后遍历成员,并查看每个成员的第一个字符。如果它是一个对象,则将其解组到您的InfoMap标头结构中;如果它是一个数组,则将其解组到该Code结构的一个切片中。

    或者,如果可以预测的话,只需将第一个成员解组为一个结构,将第二个成员解构为切片。

    我在操场上举了这种方法的例子

    type Response struct {
        ID        int               `json:"id"`
        RawResult []json.RawMessage `json:"result"`
        Header    *Header           `json:"-"`
        Values    []*Value          `json:"-"`
    }
    
    type Header struct {
        Bundled bool   `json:"bundled"`
        Type    string `json:"type"`
    }
    
    type Value struct {
        Name  string `json:"name"`
        Value string `json:"value"`
    }
    
    func main() {
        //error checks ommitted
        resp := &Response{}
        json.Unmarshal(rawJ, resp)
        resp.Header = &Header{}
        json.Unmarshal(resp.RawResult[0], resp.Header)
        resp.Values = []*Value{}
        json.Unmarshal(resp.RawResult[1], &resp.Values)
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看