programing

긴 숫자에 의한 JSON 언마셜링에 부동소수점 번호가 부여됩니다.

newsource 2023. 3. 21. 22:13

긴 숫자에 의한 JSON 언마셜링에 부동소수점 번호가 부여됩니다.

골랑을 사용하여 JSON을 마셜링 및 마셜링 해제하고 숫자 필드를 사용하면 긴 숫자를 사용하는 대신 부동소수점 숫자로 변환합니다.

JSON은 다음과 같습니다.

{
    "id": 12423434, 
    "Name": "Fernando"
}

끝나고marshal지도와unmarshal다시 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}

첫번째로 보이는 것은marshalFP를 생성합니다.어떻게 하면 길게 고칠 수 있을까요?

이것은 골랜드 놀이터에 있는 프로그램에 대한 링크입니다.http://play.golang.org/p/RRJ6uU4Uw-

구조를 미리 정의할 수는 없지만 변경되지 않은 상태로 marshal-unmarshal 프로세스를 통과해야 하는 경우가 있습니다.

이 경우,UseNumber에 대한 방법.json.Decoder이로 인해 모든 번호가 로부터 마샬링 해제됩니다.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}

JSON 규격에는 롱이나 플로트가 없고 숫자만 있습니다.json다른 것을 정의하지 않은 경우 패키지는 float64로 간주됩니다(즉, 제공만 제공).Unmarshal와 함께interface{}).

Volker가 언급한 대로 적절한 구조를 만들어야 합니다.

package main

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

type Person struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
}

func main() {

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

    //Marshal the json to a proper struct
    var f Person
    json.Unmarshal(b, &f)

    //print the person
    fmt.Println(f)

    //unmarshal the struct to json
    result, _ := json.Marshal(f)

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

결과:

{12423434 페르난도}
{"id":param23434,name":"페르난도"}

Playground : http://play.golang.org/p/2R76DYVgMK

편집:

동적 json 구조를 가지고 있고 구조의 이점을 사용하고자 하는 경우, 다음을 사용하여 해결할 수 있습니다.json.RawMessage. 유형 변수json.RawMessageraw JSON 문자열이 저장되므로 나중에 어떤 오브젝트가 포함되어 있는지 알게 되면 적절한 구조체로 마찰을 해제할 수 있습니다.어떤 솔루션을 사용하든 어떤 경우에도if또는switch어떤 유형의 구조인지 판별할 수 있습니다.

또한 JSON 데이터의 일부가 다른 JSON 개체(예:id- JSON RPC 요청 값.

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

Playground 예제의 수정 버전: http://play.golang.org/p/85s130Sthu

편집 2:

JSON 값의 구조가 이름/값 쌍의 이름을 기반으로 하는 경우 다음과 같은 작업을 수행할 수 있습니다.

type Container map[string]json.RawMessage

언급URL : https://stackoverflow.com/questions/22343083/json-unmarshaling-with-long-numbers-gives-floating-point-number