duanpao4522 2016-08-23 09:18
浏览 99
已采纳

解码map和array json

External API returns empty array if no items:

{"items":[]}

...or map with items:

{"items":{"1": {...}, "2": {...}}}

How can I decode both of them? I tried using this struct:

var response struct {
    Items map[string]Item
    Array []Item `json:"items"`
}

But it doesn't work.

UPDATE: Best if both (array and object) will produce a map[string]Item (empty and filled)

  • 写回答

2条回答 默认 最新

  • doutan8775 2016-08-23 14:50
    关注

    If you need to unmarshall to a variable type, the easiest way is to unmarshal into a map[string]interface{} and type-assert (or in this case, type-switch) your way out.

    func Unmarshal(data []byte) (map[string]Item, error) {
        var d struct {
            Items interface{} `json:"items"`
        }
        if err := json.Unmarshal(data, &d); err != nil {
            return nil, err
        }
        switch dv := d.Items.(type) {
        case []interface{}:
            if len(dv) == 0 {
                return nil, nil
            }
        case map[string]interface{}:
            m := make(map[string]Item)
            for k, v := range dv {
                m[k] = Item(v)
            }
            return m, nil
        }
        // fallthrough return if different type, or non-empty array
        // Could have put this in a default case, but this catches non-empty arrays too
        return nil, fmt.Errorf("unexpected type in json")
    }
    

    Here's an example showing it works for both of your provided examples: https://play.golang.org/p/c0oZX2-xpN

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计