如何使用goreq接收复杂的json?

如何使用goreq接收复杂的json?,json,rest,go,struct,Json,Rest,Go,Struct,我是Go的初学者,我正在尝试调用json rest API,我正在尝试使用。在自述文件中,它给出了解码接收到的json的方法: type Item struct { Id int Name string } var item Item res.Body.FromJsonTo(&item) 我理解这个例子,但我收到的json要复杂得多(见下文)。我不确定如何创建一个表示这个复杂结构的struct。我可以在一个结构中编写它吗?或者我是否需要为bid和ask数组使用映射,

我是Go的初学者,我正在尝试调用json rest API,我正在尝试使用。在自述文件中,它给出了解码接收到的json的方法:

type Item struct {
    Id int
    Name string
}

var item Item

res.Body.FromJsonTo(&item)
我理解这个例子,但我收到的json要复杂得多(见下文)。我不确定如何创建一个表示这个复杂结构的
struct
。我可以在一个
结构
中编写它吗?或者我是否需要为bid和ask数组使用映射,为bid和ask对象使用另一个结构,为
的“vars”
对象使用另一个结构

是否有任何automagic
json\u 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
    }
}
TL;DR

我能把它写在一个结构中吗

或者我是否需要使用地图进行出价和出价数组,以及其他 bid和ask对象的结构

在我真的把手伸到这里之前,我建议你多花点时间习惯围棋中的动作。这可能是一项乏味的工作,但非常简单

长版本

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

如果您只需要在程序中表示它,而不需要任何JSON,那么您也将以同样的方式进行

在我们开始翻译之前,让我们先用英语解释一下你的信息:

您有一个包含以下字段的结构:

  • 成功-布尔
  • 消息字符串
  • 结果-结构
现在,Result也是一个struct,所以我们需要描述它:

  • Bids-结构的数组
  • Asks-结构的数组
  • 滑动整数
让我们对出价和要求做同样的事情(看起来一样,这样我会节省空间)

  • 数量-整数
  • 价格浮动64
  • Cm-字符串
现在让我们定义我们的结构:

让我们将容器结构称为“Response”,将结果称为“result”

不要忘记添加注释,以便(取消)封送处理函数可以将JSON中的字段与结构正确匹配

我相信以上是实现这一点的最佳且更易于维护的方法,但是您也可以使用嵌套的匿名结构编写相同的结构:

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结构,您可以立即在代码中声明:

谢谢您的回答。我已经想到了类似的东西,但是从Python开始,我无法想象接收一些简单的json会如此麻烦。但现实是,;就是这么麻烦。我正在调用大约10个不同的API调用,从许多API调用中,我只想得到一个简单的数字。在Python中,每次调用只需执行一行程序:
requests.get('http://url.com/facts').json()['result']['bids'][0]['price']
。在go中,每次通话大约需要25条线路。Go在很多方面都很棒,但这不是其中之一。我完全理解Python/Ruby带给你的感受。然而,随着时间的推移,你会发现这种方法实际上有积极的一面。顺便说一句,如果你对答案感到满意,请不要忘记接受它:)我可以问一下你认为这种方法的积极方面是什么吗?我很想知道为什么这真的很棒,但目前我没能做到。
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"`
}