Go で JSON を解析するときに Int64 値を保持する
次の JSON 本文を考慮します。
{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}
json を使用する場合この JSON (64 ビット) を処理するための Go の .Unmarshal() Go の JSON パーサーの性質により、整数値 (id) は多くの場合 float64 に変換されます。精度を維持する必要がある場合、これは問題になる可能性があります。
解決策 1: カスタム デコーダー
1 つの方法は、カスタム デコーダーと json.Number 型を使用することです。 json.Number は、JSON 数値リテラルを表す型です。
import ( "encoding/json" "fmt" "bytes" "strconv" ) func main() { body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`) dat := make(map[string]interface{}) d := json.NewDecoder(bytes.NewBuffer(body)) d.UseNumber() if err := d.Decode(&dat); err != nil { panic(err) } tags := dat["tags"].([]interface{}) n := tags[0].(map[string]interface{})["id"].(json.Number) i64, _ := strconv.ParseUint(string(n), 10, 64) fmt.Println(i64) // Prints 4418489049307132905 }
解決策 2: カスタム構造
もう 1 つのオプションは、JSON をカスタム構造にデコードすることです。具体的にはデータ形式と一致します。
import ( "encoding/json" "fmt" ) type A struct { Tags []map[string]uint64 // "tags" } func main() { body := []byte(`{"tags": [{"id": 4418489049307132905}, {"id": 4418489049307132906}]}`) var a A if err := json.Unmarshal(body, &a); err != nil { panic(err) } fmt.Println(a.Tags[0]["id"]) // Logs 4418489049307132905 }
このソリューションでは、uint64 が直接使用されます。構造体を変更し、64 ビット整数値が確実に保持されるようにします。
以上がGo で JSON をアンマーシャリングするときに Int64 の精度を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。