Jac*_*ang -4 json go deserialization
我想json strings用go语言反序列化。不同键的值类型不同。例如string {\"category\":\"6\",\"cid\":2511993760745787586}?category类型是string,cid类型是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)
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
[map[category:6 cid:2511993760745787392] map[category:5 cid:2504429915944783872]]
显然吗?这不是我想要的,因为cidare 2511993760745787392和的结果2504429915944783872,但我原来的cidare 2511993760745787586和2504429915944783937。
除了使用结构,还有更好的方法吗?
正常的方法是使用struct:
type myStruct struct {
Category string `json:"category"`
CID int64 `json:"cid"`
}
var oriInfo []myStruct
err := json.Unmarshal([]byte(pickled), &oriInfo)
// ... etc
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您的问题,因为您的问题是浮点舍入错误的结果。
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |