2013-08-30 9 views
10

私は、このようなjsonオブジェクトの文字列を複数の型にマッピングしますか?

{ 
    "a": "apple", 
    "b": 2 
} 

としてJSONオブジェクトに変換することができますマップを作成したいがgolangはマップがタイプで宣言するように指定し、私はマップ[文字列]文字列を持っているか、[文字列]をマッピングすることができますint。上記のようなjsonオブジェクトを作成するにはどうすればよいですか?

注:実行時またはjsonオブジェクトを作成する必要があるときまで、必要なデータおよび/またはタイプはわかりません。したがって、私はちょうどあなたが常に任意の型を格納するのにinterface{}を使用することができます

type Foo struct { 
    A string `json:"a"` 
    B int `json:"b"` 
} 

答えて

19

のようなオブジェクトを作成することはできません。 encoding/jsonパッケージ内のドキュメントが言うように:インタフェース値に非整列化JSONへ

、非整列化は、インタフェース値に含まれる具体的な値にJSONをアンマーシャル。インタフェース値がゼロである場合、すなわち、その中に格納されている具体的な値は、非整列化格納インタフェース値のこれらのいずれかがありません:JSONのブールため

ブールを、JSON番号JSON用
ストリング用 のfloat64
、ストリング
[] JSONアレイ用インターフェース{}、
マップヌルJSONため
ゼロオブジェクトJSONは[ストリング]インターフェース{}、

ちょうど次の操作を行います

m := map[string]interface{}{"a":"apple", "b":2} 
+0

いずれかの値も配列にできますか? 'foo'、2、 "bar"、false、{"baz": "boo"、 "boo"、 "boo" "bat"、 "moreFoo":7}]} ' –

+1

@BrantleyBeairdはい!空のインタフェース( 'interface {}')は、配列を含むあらゆる型を保持します。配列には任意の型が含まれているので、 '[] interface {}'となるでしょう。 – ANisus

+0

インタフェース型( 'interface {}'はメソッドを持たない)は基本型を保持できますが、 (付加的なタイプ情報は、その値がインタフェース値に変換される瞬間に記憶される)およびいくつかの処理の点で、あなたが動的な言葉から慣れることができる柔軟性のいくつかを支払うための合理的な価格は、そうする理由がないときに使用するものではありません。インターフェースタイプは、他のインターフェースタイプを除き、基本タイプを保持することができます。これには、int、float64などのプレーンタイプだけでなく、配列、マップ、チャンネルなども含まれます。 – thomasrutter

関連する問題