どのようにGOの任意のJSONで動作するように?
抄録
ほとんどの場合、データを操作するときは、そのデータを受け取るスキーマを知っていますが、受信した構造体が正確にわからない場合があります.囲碁で任意のJSONデータを扱う方法についてお話します.
固定構造のJSON
あなたが既に構造を知っているJSONを受け取るとき、それはかなり簡単に働くことです.
struct
を作成し、その構造体にバイトをunmarshalし、JSONパッケージは残りの面倒を見ます.あなたがJSONで今日の夕食に関する情報を受け取ると仮定してください、そして、毎日の夕食は以下の構造を持ちます.type Dinner struct {
MainCourse string `json:"main_course"`
Beverage string `json:"beverage"`
HasDessert bool `json:"has_dessert"`
}
次のJSON値を受け取ります.food := []byte(`
{
"main_course": "Biryani",
"beverage": "Coca Cola",
"has_dessert": true
}
`)
JSONから値を保持できる変数を作成する必要があります.var dinner Dinner
結局、以下のようにdinner
変数に値をデコードします.json.Unmarshal(food, &dinner)
さて、これらの値は、構造体のフィールドからアクセスできます.ラッキー・ユー、デザート・デザート😋.dinner.MainCourse // Biryani
dinner.HasDessert // true
あなたが知らないJSON
食べ物から買い物リストまで私たちの心を分けましょう.今週末は、いくつかの食料雑貨を購入し、リスト内の項目は、毎週変更してくださいすべての週末を想定します.あなたが構造体にそれを表す必要がある場合は、運を得た!
非常にランダム性が進化している囲碁のほとんどすべてのように、インターフェイスを使用する必要があります.特に空のインターフェース.このような買い物リストを表すことができます.
var shoppingList interface{}
空のインターフェイスは任意の型を満たすことができますので、マーシャリングを行うために使用することができます.listJSON := []byte(`
{
"food": {
"ketchup": "1pc",
"noodles": "1pc",
"rice": "2Kg"
},
"utensils": {
"knives": 2,
"forks": 3
}
}
`)
json.Unmarshal(listJSON, &shoppingList)
この時点でshoppingList
は次のようになります.shoppingList = map[string]interface{
"food": map[string]interface{
"ketchup": "1pc",
"noodles": "1pc",
"rice": "2Kg"
},
"utensils": map[string]interface{
"knives": 2,
"forks": 3
}
}
データにアクセスするには、map[string]interface{}
に型アサーションを作成できます.list := shoppingList.(map[string]interface{})
その後、正規マップのような値にアクセスできます.しかし入れ子になっている値については、再度型アサーションを行う必要があります.utensils := list["utensils"].(map[string]interface{})
utensils["forks"] // 3
結論
インターフェイスの助けを借りて任意のJSONを処理できます.unmarshal関数とJSONデータに空のインターフェイスを渡す必要があります.型アサーションの後、任意のフィールドとその値を使用するのは良いです.
Reference
この問題について(どのようにGOの任意のJSONで動作するように?), 我々は、より多くの情報をここで見つけました https://dev.to/iaziz786/how-to-work-with-arbitrary-json-in-go-1f71テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol