2015-02-09 33 views
5

vorrei creare un JSON di un GatewayInfo cui il tipo è definita in questo modo:Golang e JSON con array di struct

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

type GatewayInfo []SpanInfo 

le informazioni sul gateway è creato con:

var gatewayInfo = make(GatewayInfo, nb_spans) 

Per creare la JSON, io uso la funzione json.Marshal:

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

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

Unfortuna tamente il risultato non è quello che mi aspettavo:

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

Come possiamo vedere, l'istanza GatewayInfo ha il SpanInfo, ma nel JSON ho vuoto SpanInfo.

+0

possibile duplicato di [I miei strutture non sono di smistamento in JSON] (http://stackoverflow.com/questions/15452004/my-structures-are-not-marshalling-into-json) –

risposta

9

I suoi campi di struct devono essere esportati (campo viene esportato se si inizia con una lettera maiuscola) o non saranno codificati:

valori Struct codificano come oggetti JSON. Ogni campo struct esportato diventa un membro dell'oggetto

Per ottenere la rappresentazione JSON come probabilmente previsto modificare il codice a questo:

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

Mentre il codice funziona, Arjan dovrebbe probabilmente notare che i nomi dei campi dovrebbero iniziare in maiuscolo. (vedi risposta icza sotto), –

+0

@ VěrošK. Chiarimento aggiunto – Arjan

+0

mi ci è voluta un'ora per trovare questa soluzione. Grazie –

2

Il pacchetto json può serializzare solo i campi esportati della struttura. Cambia la tua struct per avviare tutti i campi con una lettera maiuscola in modo che possano essere inclusi nell'output:

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

Leggere la documentazione di json.Marshal() per i dettagli e ulteriori informazioni.