/ / Unmarshal JSON generico in Go - JSON, generici, vai

unsonico generico in Go - json, generici, via

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 № 1

Il 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:

  1. La funzione json.Unmarshal posso solo impostare variabili all'interno della tua struct che vengono esportate, cioè che iniziano con lettere maiuscole. Usa qualcosa come ID e Name per i nomi delle variabili all'interno myStruct1.
  2. Il tuo contenuto è JSON non valido. Quello che vuoi veramente è {"ID":"id1","Name":"myName"}.
  3. Stai passando object a parseJSON ma tu stai usando parsed invece, no object. Rendere parseJSON ricevere a *myStruct (invece di un interface{}), e usa quella variabile invece di parsed quando si smonta la stringa. Anche, sempre gestire i ritorni di errore, come err := json.Unmarshal(content, object)e controlla err.

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.