2015-02-09 160 views
5

的阵列我想创建GatewayInfo的JSON其中类型被这样定义:Golang和JSON结构

var gatewayInfo = make(GatewayInfo, nb_spans) 

到:

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

type GatewayInfo []SpanInfo 

网关信息与创建创建JSON,我用json.Marshal函数:

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

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

Unfortuna tely结果不是我所期待的:

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

+0

可能重复( http://stackoverflow.com/questions/15452004/my-structures-are-not-marshalling-into-json) – 2015-02-09 14:19:07

回答

9

你的结构域必须出口(如果它以大写字母开头场出口),否则将无法进行编码:

结构值编码为JSON对象。每个出口结构领域 成为对象

要获得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 
+0

虽然代码这个答案的工作原理,但Arjan应该注意,字段的名称应该以大写字母开头。 (请参阅下面的icza答案), – 2017-07-25 10:31:16

+0

@VěrošK.添加说明 – Arjan 2017-07-25 16:55:47

+0

我花了一个小时才找到这个解决方案。谢谢 – 2017-11-30 08:55:05

2

json软件包只能序列化您的结构的导出字段。改变你的结构与一个大写字母,使他们能够包括在输出启动所有领域:

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

阅读的json.Marshal()的文档细节和更多信息。