dqmg80654 2019-06-26 08:25
浏览 119
已采纳

反序列化JSON数字返回错误的值

I want to deserialize json strings with the go language. The value types of different keys are different. for example,in string {\"category\":\"6\",\"cid\":2511993760745787586}category type is string, cid type is int64.

my code is as follows:

func main() {
    oriInfo := make([]interface{}, 0)
    pickled := "[{\"category\":\"6\",\"cid\":2511993760745787586},{\"category\":\"5\",\"cid\":2504429915944783937}]"
    err := json.Unmarshal([]byte(pickled), &oriInfo)
    if err != nil {
        fmt.Println(err)
        return
    }
    all := make([]map[string]interface{}, 0, len(oriInfo))
    for _, val := range oriInfo {
        m := make(map[string]interface{})
        for k, v := range val.(map[string]interface{}) {
            switch k {
            case "category":
                m[k] = v.(string)
            case "cid":
                m[k] = int64(v.(float64))
            }
        }
        all = append(all, m)
    }
    fmt.Println(all)
}

The results are as follows:
[map[category:6 cid:2511993760745787392] map[category:5 cid:2504429915944783872]]

Obviously,this is not what I want, because the result of cid are 2511993760745787392 and 2504429915944783872, but my original cid are 2511993760745787586 and 2504429915944783937.
In addition to using a struct, is there a better way?

  • 写回答

1条回答 默认 最新

  • donglianer5064 2019-06-26 08:31
    关注

    The normal way to do this would be with a struct:

    type myStruct struct {
        Category string `json:"category"`
        CID      int64  `json:"cid"`
    }
    
    var oriInfo []myStruct
    err := json.Unmarshal([]byte(pickled), &oriInfo)
    // ... etc
    
    

    This should solve your problem, since your problem is the result of floating point rounding error.

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

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名