Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用长数字进行JSON解组可以得到浮点数_Json_Floating Point_Go_Marshalling - Fatal编程技术网

使用长数字进行JSON解组可以得到浮点数

使用长数字进行JSON解组可以得到浮点数,json,floating-point,go,marshalling,Json,Floating Point,Go,Marshalling,例如,我使用golang对JSON进行封送和解封,当我想使用数字字段时,golang将其转换为浮点数,而不是使用长数字 我有以下JSON: { "id": 12423434, "Name": "Fernando" } 在封送后,将其封送至映射,并再次解组至我得到的json字符串: { "id":1.2423434e+07, "Name":"Fernando" } 如您所见,“id”字段采用浮点表示法 我使用的代码如下所示: package main imp

例如,我使用golang对JSON进行封送和解封,当我想使用数字字段时,golang将其转换为浮点数,而不是使用长数字

我有以下JSON:

{
    "id": 12423434, 
    "Name": "Fernando"
}
封送
后,将其封送至映射,并再次
解组
至我得到的json字符串:

{
    "id":1.2423434e+07,
    "Name":"Fernando"
}
如您所见,
“id”
字段采用浮点表示法

我使用的代码如下所示:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {

    //Create the Json string
    var b = []byte(`
        {
        "id": 12423434, 
        "Name": "Fernando"
        }
    `)

    //Marshal the json to a map
    var f interface{}
    json.Unmarshal(b, &f)
    m := f.(map[string]interface{})

    //print the map
    fmt.Println(m)

    //unmarshal the map to json
    result,_:= json.Marshal(m)

    //print the json
    os.Stdout.Write(result)

}
它打印:

map[id:1.2423434e+07 Name:Fernando]
{"Name":"Fernando","id":1.2423434e+07}
似乎映射的第一个
封送
生成FP。我怎样才能把它修好

这是高尔夫球场项目的链接: 没有长或浮点数,它只有数字。当您没有定义任何其他内容时,
json
包将采用float64(也就是说,只提供了带有
接口{}
Unmarshal

您应该做的是创建一个适当的结构(正如Volker提到的):

结果:

decoded to map[string]interface {}{"id":"12423434", "Name":"Fernando"}
encoded to {"Name":"Fernando","id":12423434}
{12423434费尔南多}
{“id”:12423434,“姓名”:“费尔南多”}

游乐场:

编辑:

decoded to map[string]interface {}{"id":"12423434", "Name":"Fernando"}
encoded to {"Name":"Fernando","id":12423434}
如果您有一个动态json结构,并且希望利用该结构的优点,您可以使用
json.RawMessage
解决它。一个类型为
json.RawMessage
的变量将存储原始json字符串,以便以后知道它包含什么类型的对象时,可以将其解组到适当的结构中。无论您使用什么解决方案,在任何情况下都需要一些
if
switch
语句来确定它是什么类型的结构

当JSON数据的一部分仅被复制到另一个JSON对象(例如JSON RPC请求的
id
-值)时,它也很有用

使用json.RawMessage和相应json数据的容器结构示例:

type Container struct {
    Type string          `json:"type"`
    Data json.RawMessage `json:"data"`
}

var b = []byte(`{"type": "person", "data":{"id": 12423434, "Name": "Fernando"}}`)
操场上示例的修改版本:

Edit2:

decoded to map[string]interface {}{"id":"12423434", "Name":"Fernando"}
encoded to {"Name":"Fernando","id":12423434}
如果JSON值的结构基于名称/值对的名称,则可以对以下对象执行相同操作:

type Container map[string]json.RawMessage

有时,您无法预先定义结构,但仍然需要数字来通过封送-解组过程

在这种情况下,您可以在
json.Decoder
上使用
UseNumber
方法,这会导致所有数字都解组为
json.Number
(这只是数字的原始字符串表示形式)。这对于在JSON中存储非常大的整数也很有用

例如:

package main

import (
    "strings"
    "encoding/json"
    "fmt"
    "log"
)

var data = `{
    "id": 12423434, 
    "Name": "Fernando"
}`

func main() {
    d := json.NewDecoder(strings.NewReader(data))
    d.UseNumber()
    var x interface{}
    if err := d.Decode(&x); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("decoded to %#v\n", x)
    result, err := json.Marshal(x)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("encoded to %s\n", result)
}
结果:

decoded to map[string]interface {}{"id":"12423434", "Name":"Fernando"}
encoded to {"Name":"Fernando","id":12423434}

不要封送到一个
map[string]接口{}
,而是一个适当的结构,例如
id
int64
字段。注释“//marshall-The-json-to-map”应该改为“//marshall-The-The-json-to-struct”。@peterSo:我刚刚注意到我漏掉了注释。修复了“struct”问题,因为我存储了不同的json结构,所以在阅读json@Fersca:那么您很可能有一些字段可以告诉您将要阅读的结构。请参阅我的编辑,了解如何处理这种动态数据结构。很好!这就是我想要的,我会尝试使用它并给出反馈。太好了,我担心真正的浮点数也会被转换成整数。幸运的是,事实并非如此:@Fersca这似乎是答案;如果你还活着,也许可以接受它?是否有使用数字不好的用例?我看不出缺点。如果你使用UseNumber,你在你的无组分JSON中不会得到数值——它只是一个字符串。每次您想要使用一个字符串时,都会再次解析字符串(这不是很有效),您需要检查方法返回的错误,这比直接使用值更麻烦。