json.Marshal(struct)は「{}」を返します


128
type TestObject struct {
    kind string `json:"kind"`
    id   string `json:"id, omitempty"`
    name  string `json:"name"`
    email string `json:"email"`
}

func TestCreateSingleItemResponse(t *testing.T) {
    testObject := new(TestObject)
    testObject.kind = "TestObject"
    testObject.id = "f73h5jf8"
    testObject.name = "Yuri Gagarin"
    testObject.email = "Yuri.Gagarin@Vostok.com"

    fmt.Println(testObject)

    b, err := json.Marshal(testObject)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(b[:]))
}

出力は次のとおりです。

[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
    {TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com}
    {}
    PASS

JSONが本質的に空なのはなぜですか?

回答:


233

フィールド名の最初の文字を大文字にして、TestObjectのフィールドをエクスポートする必要があります。変更kindするKindというように。

type TestObject struct {
 Kind string `json:"kind"`
 Id   string `json:"id,omitempty"`
 Name  string `json:"name"`
 Email string `json:"email"`
}

encoding / jsonパッケージと同様のパッケージは、エクスポートされていないフィールドを無視します。

`json:"..."`フィールド宣言に続く文字列がある構造体タグ。この構造体のタグは、JSONとのマーシャリング時に構造体のフィールドの名前を設定します。

playground


「omitempty」の前には「スペース」がないはずです
デイモン

小文字で作れますか?
user123456

あなたは、小さな文字のタグをしたい場合は、フィールドstackoverflow.com/questions/21825322/...
user123456

1
@ user123456 json(この回答の最後の段落で説明されているように)フィールドタグを使用して、JSONフィールド名を小文字の名前に設定します。
マフィントップ

28
  • 最初の文字が大文字の場合場合、識別子は使用するコードの一部に公開されます。
  • 最初の文字が小文字の場合、識別子はプライベートであり、宣言されたパッケージ内でのみアクセスできます。

 var aName // private

 var BigBro // public (exported)

 var 123abc // illegal

 func (p *Person) SetEmail(email string) {  // public because SetEmail() function starts with upper case
    p.email = email
 }

 func (p Person) email() string { // private because email() function starts with lower case
    return p.email
 }

3
素晴らしい男、完璧な仕事最初の文字だけを大文字に変更してください、どうもありがとうございました
vuhung3990

2
まさにIn Go, a name is exported if it begins with a capital letter。状況を把握するには、このGo Basics Tour
Mohsin

3

golangで

構造体の最初の文字はexを大文字にする必要があります。電話番号->電話番号

=======詳細を追加

まず、このようにコーディングしてみます

type Questions struct {
    id           string
    questionDesc string
    questionID   string
    ans          string
    choices      struct {
        choice1 string
        choice2 string
        choice3 string
        choice4 string
    }
}

golangコンパイルはエラーではなく、警告も表示されません。しかし、応答は空です

その後、私はグーグルを検索してこの記事を見つけました

構造体型と構造体型リテラルの 記事次に、コードを編集してみます。

//Questions map field name like database
type Questions struct {
    ID           string
    QuestionDesc string
    QuestionID   string
    Ans          string
    Choices      struct {
        Choice1 string
        Choice2 string
        Choice3 string
        Choice4 string
    }
}

仕事です。

助けを願っています。


1
詳細を追加
バジル

うん、私は詳細を追加します。
スーパーアップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.