go言語においてJSONをあつかう際には、構造体を定義してmappingするのが一般的です。 ほとんどの場合この方法で良いのですが、たまにStructを定義したくない、できない状況があるかもしれません。 struct定義することなくJSONを扱う方法について記載していきます。
jsonを楽に使うパッケージ:github.com/aimof/jaasonを作っている時に得た知見をまとめました。
はじめに:json.Unmarshal()
の基本
JSONをjson.Unmarshal()でunmarshalした際には、以下の型になります。
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
ご存知の通り、JSONには、booleans, numbers, strings, arrays, objects, nullの6つの型しかありません。
Arrayから中身を取り出す方法
interface{}から取り出すのが若干面倒くさいのですが、以下に例を上げておきます。
// Unmarshalしたinterface{}をarray、取り出したい要素のindexをindexとすると
var value interface{}
if index >= 0 && index < len(array.([]interface{})) {
value = array.([]interface{})[index]
}
これで、value変数にinterface{}
として、値が入りました。
値をinterface{}以外の型に変換するときは、
s := value.(string)
みたいにすればokです。
Objectから値を取り出す。
// Unmarshalしたinterface{}をobject、取り出したい要素のkeyをkeyとすると
value, ok := object.(map[string]interface{})
if !ok {
// 適当なハンドリング
}
valueを使う際は同様です。
注意
interface{}から型を取り出すときは、必ず型チェックしましょう。 いともたやすくpanicします。