Go言語においてstruct定義をすることなくJSONを扱うときのTips

January 05, 2019

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します。


Written by aimof
Goプログラマ。PythonやJSなどもちょくちょく触る。最近はGatsbyのカスタマイズが楽しい。 Twitter