17

我在 Mac OS X 10.8.2 上使用 Go 1.0.3,我正在试验这个json包,试图将一个结构编组为 json,但我一直得到一个空的{}json 对象。

err值为nil,所以根据json.Marshal函数没有错,结构是正确的。为什么会这样?

package main

import (
  "encoding/json"
  "fmt"
)

type Address struct {
  street string
  extended string
  city string
  state string
  zip string
}

type Name struct {
  first string
  middle string
  last string
}

type Person struct {
  name Name
  age int
  address Address
  phone string
}

func main() {
  myname := Name{"Alfred", "H", "Eigenface"}
  myaddr := Address{"42 Place Rd", "Unit 2i", "Placeton", "ST", "00921"}
  me := Person{myname, 24, myaddr, "000 555-0001"}

  b, err := json.Marshal(me)

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

  fmt.Println(string(b))    // err is nil, but b is empty, why?
  fmt.Println("\n")
  fmt.Println(me)           // me is as expected, full of data
}
4

3 回答 3

40

您必须公开要编组的字段。像这样:

type Address struct {
  Street string
  Extended string
  City string
  State string
  Zip string
}

errnil因为所有导出的字段(在这种情况下没有)都已正确编组。

工作示例: https: //play.golang.org/p/9NH9Bog8_C6

查看文档http://godoc.org/encoding/json/#Marshal

于 2013-03-16T16:59:58.600 回答
5

请注意,您还可以通过执行以下操作来操作生成的 JSON 中字段的名称:

type Name struct {
  First string `json:"firstname"`
  Middle string `json:"middlename"`
  Last string `json:"lastname"` 
}
于 2016-02-05T04:38:05.553 回答
0

JSON 库无法查看结构中的字段,除非它们是公共的。在你的情况下,

type Person struct {
  name Name
  age int
  address Address
  phone string
}

字段名称、年龄、地址和电话不公开(以小写字母开头)。在 golang 中,变量/函数是公共的,当它们以大写字母开头时。因此,要使其正常工作,您的结构需要看起来像这样:

type Person struct {
  Name Name
  Age int
  Address Address
  Phone string
}
于 2019-06-05T14:35:49.527 回答