どのように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データに空のインターフェイスを渡す必要があります.型アサーションの後、任意のフィールドとその値を使用するのは良いです.