Go 言語(以下
golang
)で JSON データを Unmarshal(Go オブジェクトにパース)する際に、JSON オブジェクトのキー名に日本語が使えないか試したらbad syntax
エラーが出る。エラー内容struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get: bad syntax for struct tag value struct field tag `json:foo` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
「"golang" json unmarshal struct field tag not compatible with reflect.StructTag.Get
」でググっても、日本語の情報がなかったので、自分のググラビリティとして。
TL; DR (今北産業)
-
エラーの内容:
-
bad syntax for struct tag value
- 訳:「構造体定義時のタグに構文エラーが発生しています」
-
struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get
- 訳:「構造体の定義でフィールドの
`json: "ほげ"`
タグはreflect.StructTag.Get
と互換がありません」
- 訳:「構造体の定義でフィールドの
-
-
原因:「構造体(
struct
)定義の際にjson
のタグ付けの構文が間違っています」type Sample struct { - Hoge string `json: "ほげ"` - Hoge string `json:foo` - Hoge string `json:"ほげ",omitempty` + Hoge string `json:"ほげ"` + Hoge string `json:"foo"` + Hoge string `json:"ほげ,omitempty"` }
-
対策:
json:
の後にスペースは入れないでください。omitempty
も付ける場合はダブルクォーテーション""
の中に入れます。
キー名にマルチバイト文字を使ってもパース(Unmarshal
)できます。しかし、記述の構文が間違っているため、エラーが出ているだけでした。とほほ ... orz
- 検証バージョン: Go v1.16、v1.22
TS; DR
data/sample.json
{
"ほげ": {
"ぴよ1": "foo",
"ぴよ2": [
"bar",
"buzz"
]
},
"ふが": {
"ぴよ1": "FOO",
"ぴよ2": [
"BAR",
"BUZZ"
]
}
}
main.go(Go1.16)
package main
import (
_ "embed"
"encoding/json"
"fmt"
"log"
)
// JSON データをバイナリに埋め込む
//go:embed data/sample.json
var myEmbeddedJSON []byte
// JSON データの構造体定義
type Samples map[string]Sample
type Sample struct {
Piyo1 string `json:"ぴよ1"`
Piyo2 []string `json:"ぴよ2"`
}
func main() {
var myData Samples
if err := json.Unmarshal(myEmbeddedJSON, &myData); err != nil {
log.Fatal(err)
}
key := "ほげ"
if _, ok := myData[key]; !ok {
log.Fatalf("%v キーはデータに存在しません", key)
}
fmt.Printf("ぴよ1 -> %#v\n", myData[key].Piyo1)
fmt.Printf("ぴよ2 -> %#v\n", myData[key].Piyo2)
}
// Output:
// ぴよ1 -> "foo"
// ぴよ2 -> []string{"bar", "buzz"}
- オンラインで動作をみる @ Go Playground
Golangのスポンサー情報(参考文献)
- 为什么Go json.Marshal拒绝这些struct标签? json标签的正确语法是什么? @ mlog.clud