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

时间:2019-06-26 08:25:53

标签: json go deserialization

我想用go语言反序列化json strings。不同键的值类型不同。例如,在string {\"category\":\"6\",\"cid\":2511993760745787586}中,category的类型为stringcid的类型为int64

我的代码如下:

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)
}

结果如下:
[map[category:6 cid:2511993760745787392] map[category:5 cid:2504429915944783872]]

很明显,这不是我想要的,因为cid的结果是25119937607457873922504429915944783872,但是我原来的cid2511993760745787586和{ {1}}。
除了使用结构,还有更好的方法吗?

1 个答案:

答案 0 :(得分:8)

通常的方法是使用struct:

container {
    position:fixed;
    left:0;
    top:0;
    right:0;
    bottom:0;
}

这应该可以解决您的问题,因为您的问题是floating point rounding error的结果。

相关问题