使用Golang处理包含结构体数组的JSON数据

25

我想创建一个 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

3个回答

46

你的结构体字段必须是公开的(即以大写字母开头)才能被编码:

结构体值编码为JSON对象。每个公开的结构体字段都成为该对象的一个成员。

如果想要按照预期获得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

4
尽管这个答案的代码可行,但Arjan可能需要注意字段名称应以大写字母开头(请参见下面icza的答案)。 - Věroš K.
@VěrošK.添加了澄清。 - Arjan
2
我花了一个小时才找到这个解决方案。谢谢。 - Gujarat Santana

13

json 包只能序列化你的结构体中公开(即大写字母开头)的字段。请将你的结构体中所有字段改为大写字母开头以便包含在输出中:

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

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


这对我来说很有效,已经在go 1.21上进行了测试。 - undefined

0

这不是一个新答案,只是对已接受答案的评论进行整合。

从原始查询

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"`
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接