json.Marshal(struct)返回" {}"

时间:2014-10-12 16:34:12

标签: json go marshalling

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

3 个答案:

答案 0 :(得分:176)

您需要通过大写字段名称中的第一个字母来export 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:"..."`字符串为struct tags。此结构中的标记在与JSON进行编组时设置结构字段的名称。

playground

答案 1 :(得分:25)

  • 当第一个字母 大写 时,标识符对任何人都是公开的 你想要使用的一段代码。
  • 当第一个字母是 小写 时,标识符是私有的, 只能在声明的包中访问。

实施例

 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
 }

答案 2 :(得分:3)

在golang中

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

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

首先,我尝试像这样编码

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

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

之后,我搜索google找到了这篇文章

结构类型和结构类型文字 Article然后...我尝试编辑代码。

//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
    }
}

正在工作。

希望获得帮助。