web-dev-qa-db-ja.com

構造体の配列を持つGolangとJSON

タイプが次のように定義されている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があります。

13
Julio

構造体フィールドはエクスポートする必要があります(大文字で始まるフィールドはエクスポートされます)。そうしないとエンコードされません。

構造体の値は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
28
Arjan

json パッケージは、構造体のエクスポートされたフィールドのみをシリアル化できます。すべてのフィールドが大文字で始まるように構造体を変更して、出力に含めることができるようにします。

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

詳細および詳細については、 json.Marshal() のドキュメントを参照してください。

7
icza

これは新しい答えではありません。これは、受け入れられた回答に対するコメントの統合です。


元のクエリから

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