解析JSON数组中的数组(Go语言)

3
我有这样的数据
"descriptionMap": [[[1,2], "a"], [[3,4], "b"]]

我正在尝试使用技术手段对此进行解码

  DescriptionMap []struct {
    OpcodeTableIdPair []int
    OpcodeDescription string   
  } `json:"descriptionMap"`

但我一直得到空数组,

[[{[] } {[] }]]

1
你的结构体与 JSON 不匹配。在 JSON 中,你有一个包含数组和字符串的数组,而在 Go 中,你有一个包含数组和字符串的结构体数组。在第二层中,数组和结构体之间存在不匹配。 - Grzegorz Żur
@GrzegorzŻur 我也尝试过使用DescriptionMap [][]struct来处理这种情况,但那也行不通。 - Shulhi Sapli
2
我认为没有直接反序列化混合类型数组([num,num],“string”)的简单方法。您需要编写自定义的反序列化程序--http://eagain.net/articles/go-json-array-to-struct/ - Nadh
1个回答

3

你有一个非常不幸的 JSON schema,它将数组视为对象。在这种情况下,您可以尽力处理如下:

type Body struct {
    DescriptionMap []Description `json:"descriptionMap"`
}

type Description struct {
    IDPair      []int
    Description string
}

func (d *Description) UnmarshalJSON(b []byte) error {
    arr := []interface{}{}
    err := json.Unmarshal(b, &arr)
    if err != nil {
        return err
    }

    idPair := arr[0].([]interface{})
    d.IDPair = make([]int, len(idPair))
    for i := range idPair {
        d.IDPair[i] = int(idPair[i].(float64))
    }

    d.Description = arr[1].(string)

    return nil
}

示例代码:https://play.golang.org/p/MPho12GJfc

需要注意的是,如果JSON中的任何类型不匹配,上述代码将会引发panic。你可以创建一个更好的版本,在这种情况下返回错误信息。


谢谢。这个很有效。不幸的是,我对JSON模式无能为力,我只是在使用它。 - Shulhi Sapli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接