cze*_*rwe 4 json go unmarshalling
我无法解开JSON构造:
{
"id": 10,
"result": [
{
"bundled": true,
"type": "RM-J1100"
},
[
{
"name": "PowerOff",
"value": "AAAAAQAAAAEAAAAvAw=="
},
{
"name": "Input",
"value": "AAAAAQAAAAEAAAAlAw=="
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
我实际上需要结果中的第二个切片项.
我目前的尝试是
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"`
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
{10 {{false } []}}
Run Code Online (Sandbox Code Playgroud)
但我也试过用这个:
type Codes struct {
Id int32 `json:"id"`
Result []interface{} `json:"result"`
}
Run Code Online (Sandbox Code Playgroud)
输出没问题:
{10 [map[type:RM-J1100 bundled:true] [map[name:PowerOff value:AAAAAQAAAAEAAAAvAw==] map[name:Input value:AAAAAQAAAAEAAAAlAw==]]]}
Run Code Online (Sandbox Code Playgroud)
我也可以参考Result [1]索引:
[map[name:PowerOff value:AAAAAQAAAAEAAAAvAw==] map[name:Input value:AAAAAQAAAAEAAAAlAw==]]
Run Code Online (Sandbox Code Playgroud)
但我无法将接口类型转换为任何其他匹配的类型.任何人都可以告诉我如何进行界面转换.什么方法将是"最好的".
cap*_*aig 10
一种选择是将最高级别的东西解组为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)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2631 次 |
最近记录: |