dqmg80654
2019-06-26 08:25
浏览 107

反序列化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.

    点赞 打赏 评论

相关推荐 更多相似问题