Golang 和 JSON 结构数组

Golang and JSON with array of struct

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

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

type GatewayInfo []SpanInfo

网关信息创建于:

var gatewayInfo = make(GatewayInfo, nb_spans)

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

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

jsonInfo, _ := json.Marshal(gatewayInfo)
log.Printf("jsonInfo: %s\n", jsonInfo)

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

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: [{},{},{},{}]

正如我们所见,GatewayInfo 实例有 SpanInfo,但在 JSON 中我有空的 SpanInfo

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

type SpanInfo struct {
    Imsi string
    Network string
    Network_status string
    Signal_quality int
    Slot int
    State string
}

阅读 json.Marshal() 的文档了解详情和更多信息。

您的结构字段必须被导出(如果字段以大写字母开头则被导出)否则它们将不会被编码:

Struct values encode as JSON objects. Each exported struct field becomes a member of the object

要获得可能预期的 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

This is not a new answer. It is just consolidation of comments on the accepted answer.


来自原始查询

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

来自答案和评论 - 请注意,结构中每个字段的第一个字符现在是大写,并且每个字段都添加了 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"`
}