問題
goでJSONデータをgoのstructにアンマーシャル(変換)するとき、もしフィールドの名前にハイフン_
があるとはまったりします。
例えばこんなJSONのデータがあります:
KPI
{
"today_sells":48,
"DAU":92,
"MAU":1849
}
生のストリングはこのように:
{"today_sells":48,"DAU":92,"MAU":1849}
データ変換するためにgoで受け皿のstructを作成して変換すると
type KPI struct {
TodaySells int
DAU int
MAU int
}
var goData = KPI{}
err = json.Unmarshal(json, &goData)
fmt.Printf("unmarshaled data are %v", goData)
を実行すると
unmarshled data are {0, 92, 1849}
と表示されます。
原因はgoの命名規則の推奨通りにgoDataのstructを作ると(フィールド名をエクスポートし、アンダーバーなしのフィールド名を使うなど)、today_sellsのフィールドが変換されなくて、デフォルトの0が入りました。
解決方法
structを定義する時にJSONのタグを入れます
type KPI struct {
TodaySells int `json:"today_sells"`
DAU int
MAU int
}
上記のようにJSONのタグさえ追加すれば、アンマーシャルができます。