我在解组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==]]
但是我无法将接口类型转换为任何其他匹配类型。谁能告诉我如何进行界面转换。哪种方法才是“最佳”。
一种选择是将顶级事物解组为json.RawMessage最初的一部分。
json.RawMessage
然后遍历成员,并查看每个成员的第一个字符。如果它是一个对象,则将其解组到您的InfoMap标头结构中;如果它是一个数组,则将其解组到该Code结构的一个切片中。
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) }