douguai6716 2013-12-30 05:29
浏览 86
已采纳

如果将值为null的字符串编码的json int解组,则使用null之前的值

I am trying to unmarshal json that contains ints encoded as strings. Using tags to specify that the field is encoded as a string works, but I am running into issues when the field is null. The main problem, it seems, is that the null is not encoded as a string so the parser ignores it and keeps going. The problem is that it jams in the previously decoded value for some reason.

Any ideas on how I can get this parsing correctly?

I have the following code:

package main

import (
    "encoding/json"
    "log"
)

type Product struct {
    Price int `json:",string,omitempty"`
}

func main() {
    data := `
[
{"price": "1"},
{"price": null},
{"price": "2"}
]
`

    var products []Product
    if err := json.Unmarshal([]byte(data), &products); err != nil {
        log.Printf("%#v", err)
    }
    log.Printf("%#v", products)

}

Output:

[]main.Product{main.Product{Price:1}, main.Product{Price:1}, main.Product{Price:2}}

Code on go playground

  • 写回答

1条回答 默认 最新

  • douxianwu2221 2013-12-30 06:41
    关注

    Feels like a bug in the json package.

    You can work around it with a custom Unmarshaller, like this, although it may be annoying if you've got a complex struct:

    func (p *Product) UnmarshalJSON(b []byte) error {
       m := map[string]string{}
       err := json.Unmarshal(b, &m)
       if err != nil {
          return err
       } 
       if priceStr, ok := m["price"]; ok {
          p.Price, _ = strconv.Atoi(priceStr)
       }
       return nil
    }
    

    http://play.golang.org/p/UKjfVqHCGi

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题