2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Golang】JSON を Unmarshal すると struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get 【bad syntax】

Last updated at Posted at 2021-12-13

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 (今北産業)

  1. エラーの内容:

    • bad syntax for struct tag value
      • 訳:「構造体定義時のタグに構文エラーが発生しています」
    • struct field tag `json: "ほげ"` not compatible with reflect.StructTag.Get
      • 訳:「構造体の定義でフィールドの `json: "ほげ"` タグは reflect.StructTag.Get と互換がありません」
  2. 原因:「構造体(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"`
    }
    
  3. 対策: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"}

Golangのスポンサー情報(参考文献)

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?