私は、サーバーからの応答のこのタイプの解析しようとしています:メッセージのこのタイプのために私自身のhack'ishのパーサーを書く以外にも解析明示的な配列
[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]]
これを解釈するための標準的な方法があることをI気づいていない?
私は、サーバーからの応答のこのタイプの解析しようとしています:メッセージのこのタイプのために私自身のhack'ishのパーサーを書く以外にも解析明示的な配列
[[1,"a","b",2,"000000",[[1,2,3],[1,2,3]],"x","y","z",[[1,2,3],[1,2,3]]]]
これを解釈するための標準的な方法があることをI気づいていない?
あなたの入力は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
(別の型を明示的に指定されていない限り)。