2017-11-20 11 views
-1

map[string]interface{}タイプを使用してGo内にJSON表現を作成しようとしています。私はJSON文字列を扱っています。私はJSONのunmarshalerが自動的に数値をfloat64として扱うのを避ける方法を考え出すのに苦労しています。その結果、次のエラーが発生します。Go:JSON文字列をマップに変換する[文字列] interface {}

例。 "{ 'a' : 9223372036854775807}"map[string]interface{} = [a 9223372036854775807する必要がありますが、現実には、私は構造体は、json.Numberを使用することによって、これを回避するために使用することができますが、私は本当に上記指定mapタイプを使用して好むどのように検索map[string]interface{} = [a 9.2233720368547758088E18]

です。

+3

JSONのデフォルトでは、すべての数値にfloat64を使用しています(https://golang.org/pkg/encoding/json/#Unmarshal)。それを整数にしたい場合は、整数値(例: 'map [string] int'または' struct {a int} ')を持つ宛先に非整列化する必要があります。それは浮動小数点型であり、単純にint型に変換することを受け入れます。 – Kaedys

+0

私は、Goの 'encoding/json'がデフォルトで、jsonの数字にfloat64を使うことを知っています。大規模なint64値を扱う場合、型変換は最も簡単な解決策になります。私は、カスタムマーシャラを書くかマップの種類を指定する必要があると思います。ありがとう – Steven

答えて

1

go json.Unmarshal(...) functionは自動的にJSON番号にfloat64を使用します。数字を別のタイプに非マーシャルしたい場合は、カスタムのマーマーを使用してカスタムタイプを使用する必要があります。アンマーシャラーがカスタム値を非一意のマップにデシリアライズするように強制する方法はありません。

たとえば、 "a"プロパティの値をbig.Intとして解析する方法は次のとおりです。

package main 

import (
    "encoding/json" 
    "fmt" 
    "math/big" 
) 

type MyDoc struct { 
    A BigA `json:"a"` 
} 

type BigA struct{ *big.Int } 

func (a BigA) UnmarshalJSON(bs []byte) error { 
    _, ok := a.SetString(string(bs), 10) 
    if !ok { 
    return fmt.Errorf("invalid integer %s", bs) 
    } 
    return nil 
} 

func main() { 
    jsonstr := `{"a":9223372036854775807}` 
    mydoc := MyDoc{A: BigA{new(big.Int)}} 

    err := json.Unmarshal([]byte(jsonstr), &mydoc) 
    if err != nil { 
    panic(err) 
    } 

    fmt.Printf("OK: mydoc=%#v\n", mydoc) 
    // OK: mydoc=main.MyDoc{A:9223372036854775807} 
} 
関連する問題