2016-12-09 4 views
2

Ich habe Daten wie dieseGo Parse-JSON-Array von Array

"descriptionMap": [[[1,2], "a"], [[3,4], "b"]] 

und ich versuchte, sie zu entschlüsseln mit

DescriptionMap []struct { 
    OpcodeTableIdPair []int 
    OpcodeDescription string 
    } `json:"descriptionMap"` 

aber ich erhalte immer leere Arrays,

[[{[] } {[] }]] 
+1

Ihre Struktur stimmt nicht mit diesem JSON überein. In JSON haben Sie Array von Arrays mit Array und String und in Go haben Sie Array von Strukturen mit Array und String. Auf der zweiten Ebene gibt es eine Diskrepanz zwischen Array und Struktur. –

+0

@ GrzegorzŻur Ich habe auch 'DescriptionMap [] [] struct' versucht, um für diesen Fall zu sorgen, aber das wird nicht funktionieren. –

+1

Ich glaube, es gibt keine einfache Möglichkeit, ein Array von gemischten Typen direkt zu mapsalisieren ([num, num]," Zeichenfolge "). Sie müssen einen benutzerdefinierten Unmarshaller schreiben - http://eagain.net/articles/go-json-array-to-struct/ – Nadh

Antwort

3

Sie haben ein sehr unglückliches JSON-Schema, das Arrays als Objekte behandelt. Das Beste, was Sie in dieser Situation tun können, ist so etwas wie dieses:

type Body struct { 
    DescriptionMap []Description `json:"descriptionMap"` 
} 

type Description struct { 
    IDPair  []int 
    Description string 
} 

func (d *Description) UnmarshalJSON(b []byte) error { 
    arr := []interface{}{} 
    err := json.Unmarshal(b, &arr) 
    if err != nil { 
     return err 
    } 

    idPair := arr[0].([]interface{}) 
    d.IDPair = make([]int, len(idPair)) 
    for i := range idPair { 
     d.IDPair[i] = int(idPair[i].(float64)) 
    } 

    d.Description = arr[1].(string) 

    return nil 
} 

Spielplatz: https://play.golang.org/p/MPho12GJfc.

Beachten Sie jedoch, dass dies in Panik gerät, wenn einer der Typen im JSON nicht übereinstimmt. Sie können eine bessere Version erstellen, die in solchen Fällen Fehler zurückgibt.

+0

Danke. Das funktioniert wirklich gut. Leider kann ich mit dem JSON-Schema nichts anfangen, ich nehme es nur auf. –