2015-03-30 20 views
13

Scenario:
Si consideri il seguente è il JSON:come analizzare/deserlize un JSON dinamica Golang

{ 
    "Bangalore_City": "35_Temperature", 
    "NewYork_City": "31_Temperature", 
    "Copenhagen_City": "29_Temperature" 
} 

Se si nota, i dati è strutturata in modo tale che non ci sia nessun disco le chiavi codificate che citano lo City/Temperature sono fondamentalmente solo valori.

Edizione: Non riesco ad analizzare alcun JSON dinamico.

Domanda: Qualcuno potrebbe aver trovato una soluzione per questo tipo di analisi JSON? Ho provato go-simplejson, gabs & predefinito encoding/json ma senza fortuna.

Nota: Il JSON sopra riportato è solo per esempio. E ci sono molte applicazioni che usano l'API corrente, quindi non voglio cambiare la struttura dei dati. Voglio dire che non posso cambiare qualcosa nel modo seguente:

[{ 
    "City_Name":"Bangalore", 
    "Temperature": "35" 
},...] 

Poi posso definire struct

type TempData struct { 
    City_Name string 
    Temperature string 
} 
+0

Leggi questo http://talks.golang.org/2015/json.slide#1 –

risposta

21

È possibile unmarshalling in un map[string]string ad esempio:

m := map[string]string{} 
err := json.Unmarshal([]byte(input), &m) 
if err != nil { 
    panic(err) 
} 
fmt.Println(m) 

uscita (avvolto):

map[Bangalore_City:35_Temperature NewYork_City:31_Temperature 
    Copenhagen_City:29_Temperature] 

Provalo su Go Playground.

In questo modo, indipendentemente dalle chiavi o dai valori, si avranno tutte le coppie in un map che è possibile stampare o ripetere il ciclo.

Si noti inoltre che, anche se il vostro esempio conteneva solo string valori, ma se il tipo di valore è variabile (ad esempio string, numeri, ecc), si possono utilizzare interface{} per il tipo di valore, nel qual caso la vostra mappa sarà di tipo map[string]interface{} .

Nota anche che ho creato una libreria per lavorare facilmente con oggetti dinamici di questo tipo che possono essere di grande aiuto in questi casi: github.com/icza/dyno.

+4

Si noti che questo funziona solo se si è certi che il proprio json non contenga valori non stringa. Altrimenti devi usare l'interfaccia 'map [string] {} {}' – Timmmm

+0

Questo presuppone anche che la struttura sia solo un livello profondo .. per esempio questo codice non funzionerà con letterali e json più profondi al primo livello. – f0ster

+1

@ f0ster Sì, che era il caso del richiedente. Per profondità arbitrarie, vedi questa domanda: [Prendendo una stringa JSON, desmettila in una mappa, modificale e esegui il marshalling di nuovo] (http://stackoverflow.com/questions/28877512/taking-a-json-string-unmarshaling- it-in-a-mapstringinterface-editing-an) – icza

Problemi correlati