带有struct数组的Golang和JSON

Jul*_*lio 11 json struct go

我想创建一个GatewayInfo类型定义的JSON,如下所示:

type SpanInfo struct {
    imsi string
    network string
    network_status string
    signal_quality int
    slot int
    state string
}

type GatewayInfo []SpanInfo
Run Code Online (Sandbox Code Playgroud)

网关信息创建于:

var gatewayInfo = make(GatewayInfo, nb_spans)
Run Code Online (Sandbox Code Playgroud)

要创建JSON,我使用以下json.Marshal函数:

gatewayInfo := getGatewayInfo(spans)
log.Printf("Polling content: %s\n", gatewayInfo)

jsonInfo, _ := json.Marshal(gatewayInfo)
log.Printf("jsonInfo: %s\n", jsonInfo)
Run Code Online (Sandbox Code Playgroud)

不幸的是结果不是我所期待的:

2015/02/09 13:48:26 Polling content: [{652020105829193 20801 Registered (Roaming) %!s(int=17) %!s(int=2) } {652020105829194 20801 Registered (Roaming) %!s(int=16) %!s(int=3) } {652020105829192 20801 Registered (Roaming) %!s(int=19) %!s(int=1) } {652020105829197 20801 Registered (Roaming) %!s(int=19) %!s(int=4) }]
2015/02/09 13:48:26 jsonInfo: [{},{},{},{}]
Run Code Online (Sandbox Code Playgroud)

我们可以看到,GatewayInfo实例有SpanInfo,但在JSON中我有空SpanInfo.

Arj*_*jan 25

必须导出结构字段(如果以大写字母开头,则导出字段)或者不对其进行编码:

结构值编码为JSON对象.每个导出的struct字段都成为该对象的成员

要获得可能需要的JSON表示,请将代码更改为:

type SpanInfo struct {
    IMSI string `json:"imsi"`
    Network string `json:"network"`
    NetworkStatus string `json:"network_status"`
    SignalQuality int `json:"signal_quality"`
    Slot int `json:slot"`
    State string `json:"state"`
}

type GatewayInfo []SpanInfo
Run Code Online (Sandbox Code Playgroud)

  • 虽然代码这个答案有效,但Arjan应该注意到字段的名称应该以大写字母开头.(见下面的icza答案), (2认同)
  • 我花了一个小时才找到这个解决方案。谢谢 (2认同)

icz*_*cza 7

json软件包只能序列化结构的导出字段。更改结构以使所有字段都以大写字母开头,以便可以将它们包含在输出中:

type SpanInfo struct {
    Imsi string
    Network string
    Network_status string
    Signal_quality int
    Slot int
    State string
}
Run Code Online (Sandbox Code Playgroud)

阅读的文档以json.Marshal()获取详细信息和更多信息。