긴 숫자에 의한 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}
첫번째로 보이는 것은marshal
FP를 생성합니다.어떻게 하면 길게 고칠 수 있을까요?
이것은 골랜드 놀이터에 있는 프로그램에 대한 링크입니다.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.RawMessage
raw 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
'programing' 카테고리의 다른 글
AngularJS: 컨트롤러를 완전히 새로고침하지 않고 해시 및 라우팅 변경 (0) | 2023.03.21 |
---|---|
약속.RxJs Observatible을 사용한 모든 동작? (0) | 2023.03.21 |
스프링 부트 시 디버깅로그 메시지를 끄는 방법 (0) | 2023.03.21 |
wordpress의 관리 사이드바에서 게시물을 제거하는 방법 (0) | 2023.03.21 |
제약 조건의 이름을 모를 때 Oracle에서 "not null" 제약 조건을 삭제하려면 어떻게 해야 합니까? (0) | 2023.03.21 |