【问题标题】:Converting Struct to JSON where a field is another Struct将 Struct 转换为 JSON,其中一个字段是另一个 Struct
【发布时间】:2017-03-31 16:11:24
【问题描述】:

我有两个结构体:

type A struct {
    Zip string `json:"zip"`
}

type B struct {
    Foo string `bson:"foo"`
    Bar A      `json:"bar"`
}

当我尝试json.Marshal B 类型时,Bar 字段无法正确转换。字段正常,但值始终为空。输出如下所示:

{"foo": "some-string-value", "bar": {"zip": ""}}

我做错了什么?

【问题讨论】:

  • 您是否填充了 Zip 字段?以及如何?
  • 所有字段都填充Bar 填充有A 的实例。并且该实例填充了Zip
  • A 的 Zip 字段未填充。专注于找出原因。
  • 已填充。当我有一个 B 的实例时,我只需执行 B.Bar = a, a 是之前正确填充的 A 的一个实例。
  • fmt.Printf("%#v\n", b) 会得到什么?

标签: json go bson


【解决方案1】:

您在 A 中的 Zip 字段未填充。

type A struct {
    Zip string `json:"zip"`
}

type B struct {
    Foo string `bson:"foo"`
    Bar A      `json:"bar"`
} 
func main() {
    one := A{"35000"}
    two := B{"Foo", one}
    json, _ := json.Marshal(two)
    fmt.Printf("%s\n", json)
}

输出是(https://play.golang.org/p/kyG1YabpSe):

{"Foo":"Foo","bar":{"zip":"35000"}}

即使有地图

type A struct {
   Zip string `json:"zip"`
}
type B struct {
   Foo string `bson:"foo"`
   Bar A      `json:"bar"`
}
func main() {
   m := make(map[string]B)

   for x := 0; x < 10; x++ {
      m[strconv.Itoa(x)] = B{"Hello", A{"35000"}}
   }

   json, _ := json.Marshal(m)
   fmt.Printf("%s\n", json)
}

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

输出很好,我不明白你错在哪里。

【讨论】:

  • 我有一张B 项目的地图,当我尝试json.Marshal(myMap) 时,Bar 字段填充了空字符串值。
  • @DanielRibeiro 你能用观察到问题的确切代码更新你的问题吗?问题中没有提到myMapB 项目的地图。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多