首页 > 解决方案 > 使用 json.Unmarshal() 时保留尾随零

问题描述

这不是Stop json.Marshal() 从浮点数中去除尾随零的副本,因为我希望取消编组(即解析 JSON 编码的数据)。

.0下面的代码中删除了尾随:https: //play.golang.org/p/jrQ3OSvoTt5

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var result map[string]interface{}
    json.Unmarshal([]byte(`{"foo": 1.0}`), &result)
    
    // map[foo:1]
    fmt.Println(result)
}

JSON 的结构只有在运行时才知道,所以我必须将其解析为map[string]interface{}.

虽然我很欣赏这一点1并且1.0在数字上是等价的,但我需要能够区分两者。

标签: jsongo

解决方案


默认解组器使用 float64。您必须使用Decoderwith UseNumber,然后数字将被解组为json.Number并且您可以处理它们。

func main() {
    var result map[string]interface{}
    dec := json.NewDecoder(strings.NewReader(`{"foo": 1.0}`))
    dec.UseNumber()
    dec.Decode(&result)

    // map[foo:1]
    fmt.Println(result)
    fmt.Println(result["foo"].(json.Number).String())
    fmt.Println(result["foo"].(json.Number).Float64())
}


推荐阅读