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本质上是空的?

Answers:


233

您需要通过大写字段名称中的第一个字母来导出 TestObject中的字段。更改kindKind,依此类推。

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

encoding / json包和类似的包会忽略未导出的字段。

`json:"..."`字段声明之后的字符串是struct标记。在与JSON封送时,此struct中的标记设置该结构的字段名称。

playground


在“超常”之前应该没有“空间”
Damon

我可以用小写字母做吗?
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'3

2
确实是In Go, a name is exported if it begins with a capital letter。要了解具体情况,请访问此Go Basics Tour
Mohsin

3

在高朗

在结构的首字母必须大写ex。电话号码->电话号码

=======添加详细信息

首先,我尝试像这样编码

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

golang编译不是错误,也不显示警告。但是回应是空的,因为

之后,我在Google搜索中找到了这篇文章

结构类型和结构类型字面 第二十然后......我尝试编辑代码。

//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
添加更多详细信息
Basil

是的,我添加了更多详细信息。
超级大赛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.