2016-10-30 7 views
2

私は、サーバーからの応答のこのタイプの解析しようとしています:メッセージのこのタイプのために私自身のhack'ishのパーサーを書く以外にも解析明示的な配列

[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]] 

これを解釈するための標準的な方法があることをI気づいていない?

答えて

4

あなたの入力はJSON文字列です。 Goでは、encoding/jsonパッケージを使用してデコードできます。

通常、JSON文字列の構造が以前にわかっている場合は、Go structタイプを作成してモデル化することができます。次に、structタイプの値に非マーシャルすることができます。

構造が不明であるか、変化している場合には、すべてのJSONデータの対象となり得るタイプinterface{}の値に非整列化可能性があります

s := `[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]]` 

var v interface{} 
if err := json.Unmarshal([]byte(s), &v); err != nil { 
    fmt.Println(err) 
    return 
} 
fmt.Println(v) 
fmt.Printf("%#v\n", v) 

出力(Go Playground上でそれを試してみてください):

[[1 a b 2 000000 [[1 2 3] [1 2 3]] x y z [[1 2 3] [1 2 3]]]] 
[]interface {}{[]interface {}{1, "a", "b", 2, "000000", []interface {}{[]interface {}{1, 2, 3}, []interface {}{1, 2, 3}}, "x", "y", "z", []interface {}{[]interface {}{1, 2, 3}, []interface {}{1, 2, 3}}}} 

ご覧のとおり、さまざまなタイプの要素(JSON番号、文字列、さらにはスライス)を持つスライススライスです。

ここで同じ出力が(ゴーのcomposite literal構文を使用して)それのよりよい感覚を得るためにインデントを追加します:もちろん

[]interface{}{ 
    []interface{}{ 
     1, "a", "b", 2, "000000", 
     []interface{}{ 
      []interface{}{1, 2, 3}, 
      []interface{}{1, 2, 3}}, 
     "x", "y", "z", 
     []interface{}{ 
      []interface{}{1, 2, 3}, 
      []interface{}{1, 2, 3}, 
     }, 
    }, 
} 

あなたが値を「抽出」しtype assertionを使用する必要があり、これは、非常に便利ではありません

fmt.Printf("%T %[1]v\n", v.([]interface{})[0].([]interface{})[0]) 
fmt.Printf("%T %[1]v\n", v.([]interface{})[0].([]interface{})[1]) 

出力:

interface{}タイプのこの「一般的な」値から、例えば、(また、検証のために、それらのタイプの印刷)第2の非列値を抽出します彼らは整数である可能性もかかわらず、移動中にJSON番号はタイプ float64の値に非整列化していることは注目に値する
float64 1 
string a 

(別の型を明示的に指定されていない限り)。