Golang中的Json unmarshal型号

时间:2017-02-01 23:52:53

标签: json go struct marshalling unmarshalling

我有一个RESTful服务,返回类似于以下显示的响应:

"Basket" : {
  "Count": 1,
  "Fruits": {[
    {
      "Name":"Mango", 
      "Season":"Summer"
    },
    {
      "Name":"Fig", 
      "Season":"Winter"}
  ]}
}

我正在尝试创建Go lang模型来解组内容。以下是我尝试的代码:

type Response struct {
    Count   int
    Fruits []Fruit
}

type Fruit struct {
    Name string
    Season string
}

但是当我在测试代码中编组Response对象时,我没有看到类似的json。 (https://play.golang.org/p/EGKqfbwFvW) Marshalled数据始终显示为:

{
  "Count":100,
  "Fruits":[
    {"Name":"Mango","Season":"Summer"},
    {"Name":"Fig","Season":"Winter"}
  ]
}

请注意,水果在原始json中显示为数组 [] 而非 {[]} 。如何在golang中为这个响应建模结构?

2 个答案:

答案 0 :(得分:1)

我会制作' Baskets' '响应'中的结构,创建' BasketsData'结构,并给它一些标签。

type Fruit struct {
    Name   string `json:"Name"`
    Season string `json:"Season"`
}

type BasketData struct {
    Count  int     `json:"Count"`
    Fruits []Fruit `json:"Fruits"`
}

type Response struct {
    Basket BasketData `json:"Basket"`
}

通过这种方式,您可以在编辑时获得顶级JSON响应。

fruitmania := []Fruit{{Name: "Mango", Season: "Summer"},
                       {Name: "Fig", Season: "Winter"}}
basket := Response{BasketData{Count: 100, Fruits: fruitmania}}

b, _ := json.Marshal(basket)
fmt.Println(string(b))

checkit-checkit out: https://play.golang.org/p/TuUwBLs_Ql

答案 1 :(得分:1)

您的模型完全正确且有效,但JSON对象不是。 "Fruits"如果它应该是键值对,则它没有名称,或者它应该包含在[]而不是{}中。

JSON obj应格式如下:

{
  "Basket" : {
    "Count": 1,
    "Fruits": [
      {
        "Name":"Mango", 
        "Season":"Summer"
      },
      {
        "Name":"Fig", 
        "Season":"Winter"
      }
    ]
  }
}

实际上无效的json不应该工作https://play.golang.org/p/yoW7t4NfI7

相关问题