gpt4 book ai didi

json - 使用列表中的不同类型解码 JSON

转载 作者:IT王子 更新时间:2023-10-29 00:40:07 25 4
gpt4 key购买 nike

我在解码 JSON 结构时遇到问题:

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

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

我目前的尝试是

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==]]

但是我无法将接口(interface)类型转换为任何其他匹配的类型。谁能告诉我如何进行接口(interface)转换。什么方法是“最好的”。

最佳答案

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

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

或者,如果它足够可预测,只需将第一个成员解码为一个结构,将第二个成员解码为一个 slice 。

我做了一个playground example这种方法。

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)
}

关于json - 使用列表中的不同类型解码 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com