如何用goreq接收复杂的json?

时间:2017-09-19 08:24:07

标签: json rest go struct

我是Go的初学者,我正在尝试调用json rest-API,我正在尝试使用goreq request lib。在自述文件中,它给出了the following example来解码收到的json:

type Item struct {
    Id int
    Name string
}

var item Item

res.Body.FromJsonTo(&item)

我理解这个例子,但我收到的json更复杂(见下文)。我不确定如何创建代表这种复杂结构的struct。我可以在一个struct中编写它,还是我需要使用地图作为出价和询问数组,另一个结构用于出价和询问对象,还有一个结构用于"vars"对象?

是否有任何自动json_to_struct()函数在收到json时动态构建结构(我看过但我找不到任何东西)?

欢迎所有提示!

{
    "success": true,
    "message": "something",
    "vars": {"some": "value", "thenumber": 7612.32},
    "result": {
        "bids": [
            {"quantity": 2, "price": 416.02, "cm": "some text"},
            etc..
        ],
        "asks": [
            {"quantity": 1, "price": 420.02, "cm": "some text"},
            etc..
        ],
        "slip": 4
    }
}

1 个答案:

答案 0 :(得分:2)

<强> TL; DR

  

我可以在一个结构中编写吗

  

或者我是否需要使用地图作为出价和询问数组,还有另一个   出价和询问对象的结构?

在我实际握手之前,我会建议你花更多的时间来习惯Go中的事情。这可能是乏味的工作,但它非常简单。

长版

  

我不确定如何创建代表这个复杂的结构   结构

如果你不得不在你的程序中代表这个,而没有任何JSON,那么你将以同样的方式去做。

在我们将其翻译成Go之前,让我们用英语解释一下你的信息:

你有一个包含字段的结构:

  • 成功 - 布尔
  • 消息 - 字符串
  • 结果 - 结构

现在,Result也是一个结构,所以我们需要描述它:

  • 出价 - 结构数组
  • 要求 - 结构数组
  • Slip - Integer

让我们对Bids和Asks做同样的事情(看起来一样,这样我就可以节省空间)

  • 数量 - 整数
  • 价格 - Float64
  • Cm - String

现在让我们定义我们的结构:

让我们调用容器结构&#34;响应&#34;结果一&#34;结果&#34;

type Response struct {
  Success bool `json:"success"`
  Message string `json:"message"`
  Result  Result `json:"result"`
}

type Result struct {
  Bids []Quote `json:"bids"`
  Asks []Quote `json:"asks"`
  Slip int `json:"slip"`
}

type Quote struct { 
//As asks and bids are have the same structure we can save code
  Quantity int `json:"quantity"`
  Price float64 `json:"price"`
  Cm string `json:"cm"`
}

不要忘记添加注释,以便(联合国)编组功能可以将JSON中的字段与Struct正确匹配。

我相信以上是实现此目的的最佳和更易维护的方式,但是您也可以使用嵌套的匿名结构编写相同的结构:

type Response struct {
    Success bool   `json:"success"`
    Message string `json:"message"`
    Result  struct {
        Bids []struct {
            Quantity int     `json:"quantity"`
            Price    float64 `json:"price"`
            Cm       string  `json:"cm"`
        } `json:"bids"`
        Asks []struct {
            Quantity int     `json:"quantity"`
            Price    float64 `json:"price"`
            Cm       string  `json:"cm"`
        } `json:"asks"`
        Slip int `json:"slip"`
    } `json:"result"`
}

顺便说一下,几周前我发现了一个有趣的工具,可以自动将JSON转换为Go结构,您可以立即在代码中声明:https://transform.now.sh/json-to-go/