1
0

More than 3 years have passed since last update.

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

Posted at

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つの型しかありません。
(jsonパッケージの解説より)

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{})[key]
if !ok {
    // 適当なハンドリング
}

valueを使う際は同様です。

注意

interface{}から型を取り出すときは、必ず型チェックしましょう。
いともたやすくpanicします。

この記事は、私のブログと同時に投稿しています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0