ではgo
標準パッケージのエンコード/ JSONが公開json.Unmarshal
機能は、JSONを解析します。
事前定義されたのJSON文字列を非整列化するかstruct
、を使用してinterface{}
、予期しないJSONデータ構造の結果を反復することができます。
そうは言っても、複雑なJSONを適切に解析することはできません。誰かがこれを達成する方法を教えてもらえますか?
{
"k1" : "v1",
"k2" : "v2",
"k3" : 10,
"result" : [
[
["v4", v5, {"k11" : "v11", "k22" : "v22"}]
, ... ,
["v4", v5, {"k33" : "v33", "k44" : "v44"}
]
],
"v3"
]
}
JSONとGoからの引用:
このデータの構造を知らなくても、Unmarshalを使用してそれをinterface {}値にデコードできます。
b := []byte(`{
"k1" : "v1",
"k3" : 10,
result:["v4",12.3,{"k11" : "v11", "k22" : "v22"}]
}`)
var f interface{}
err := json.Unmarshal(b, &f)
この時点で、fのGo値は、キーが文字列であり、値自体が空のインターフェース値として格納されているマップになります。
f = map[string]interface{}{
"k1": "v1",
"k3": 10,
"result": []interface{}{
"v4",
12.3,
map[string]interface{}{
"k11":"v11",
"k22":"v22",
},
},
}
このデータにアクセスするには、型アサーションを使用して、
f
基になるmap [string] interface {} にアクセスします。
m := f.(map[string]interface{})
次に、rangeステートメントでマップを反復処理し、型スイッチを使用して、具体的な型として値にアクセスできます。
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
このようにして、タイプセーフのメリットを享受しながら、未知のJSONデータを操作できます。
GoとJSONの詳細については、元の記事をご覧ください。コードスニペットを少し変更して、質問のJSONに類似させました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加