Sono un nuovo programmatore Go (da Java) e mi piacerebbe riprodurre un modo generico che è esay da usare in Java.
Voglio creare una funzione che mi permetta di fare un Unmarshal su una stringa JSON per evitare la duplicazione del codice.
Questo è il mio codice corrente che non funziona:
type myStruct1 struct {
id string
name string
}
func (obj myStruct1) toString() string {
var result bytes.Buffer
result.WriteString("id : ")
result.WriteString(obj.id)
result.WriteString("n")
result.WriteString("name : ")
result.WriteString(obj.name)
return result.String()
}
func main() {
content := `{id:"id1",name="myName"}`
object := myStruct1{}
parseJSON(content, object)
fmt.Println(object.toString())
}
func parseJSON(content string, object interface{}) {
var parsed interface{}
json.Unmarshal([]byte(content), &parsed)
}
Questo codice, in esecuzione, mi restituisce questo:
id :
name :
Hai qualche idea ?
Grazie
risposte:
2 per risposta № 1Il problema è che vuoi scrivere su un tipo generico? Probabilmente vuoi una mappa di stringhe. Ciò funziona comunque con BSON:
var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)
Sarai in grado di accedere ai campi in questo modo:
anyJson["id"].(string)
Non dimenticare di digitare asserire i tuoi valori, e loro dovere essere il tipo corretto o si faranno prendere dal panico. (Puoi leggere di più sulle asserzioni di tipo sul sito golang)
0 per risposta № 2
Devi esportare i tuoi campi:
type myStruct1 struct {
Id string
Name string
}
Vedere Identificatori esportati dalla documentazione.
0 per risposta № 3
Ci sono alcune modifiche che devi apportare nel tuo codice per farlo funzionare:
- La funzione
json.Unmarshal
posso solo impostare variabili all'interno della tua struct che vengono esportate, cioè che iniziano con lettere maiuscole. Usa qualcosa comeID
eName
per i nomi delle variabili all'internomyStruct1
. - Il tuo contenuto è JSON non valido. Quello che vuoi veramente è
{"ID":"id1","Name":"myName"}
. - Stai passando
object
aparseJSON
ma tu stai usandoparsed
invece, noobject
. RendereparseJSON
ricevere a*myStruct
(invece di uninterface{}
), e usa quella variabile invece diparsed
quando si smonta la stringa. Anche, sempre gestire i ritorni di errore, comeerr := json.Unmarshal(content, object)
e controllaerr
.
Ti suggerisco di fare il Tour di Golang ;)
0 per risposta № 4
Unmarshal imposta solo i campi esportati della struttura.
Il che significa che è necessario modificare la struttura di json per utilizzare lettere maiuscole:
type myStruct1 struct {
Id string
Name string
}
La ragione di ciò è che la libreria json non ha la capacità di visualizzare i campi usando reflect a meno che non vengano esportati.