web-dev-qa-db-ja.com

Go json.Marshalがこれらの構造体タグを拒否するのはなぜですか? jsonタグの適切な構文は何ですか?

Json.Marshalを使用しようとしていますが、structタグを受け入れることができません。

私は何が間違っているのですか?

これが「marshal.go」のソースコードです

https://play.golang.org/p/eFe03_89Ly9

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json: "name"`
    Age  int    `json: "age"`
}

func main() {
    p := Person{Name: "Alice", Age: 29}
    bytes, _ := json.Marshal(p)
    fmt.Println("JSON = ", string(bytes))
}

「govetmarshal.go」からこれらのエラーメッセージが表示されます

./marshal.go:9: struct field tag `json: "name"` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
./marshal.go:10: struct field tag `json: "age"` not compatible with reflect.StructTag.Get: bad syntax for struct tag value

プログラムを実行すると、この出力が得られます。

% ./marshal
JSON =  {"Name":"Alice","Age":29}

フィールド名がGo構造と一致し、jsonタグを無視していることに注意してください。

何が足りないのですか?

5
David Jones

おやまあー!私はそれを理解しました。 json:とフィールド名"name"の間にスペースを入れることはできません。

「govet」エラーメッセージ("bad syntax")は非常に役に立ちません。

次のコードは機能します。違いがわかりますか?

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    p := Person{Name: "Alice", Age: 29}
    bytes, _ := json.Marshal(p)
    fmt.Println("JSON = ", string(bytes))
}
14
David Jones