2016-12-03 2 views
2

Ich versuche testen, wie eine JSON-Antwort von einer API, die ich benutze, entpacken.Go: unerwartetes Ende der JSON-Eingabe und json.Unmarshal gibt Nullwerte zurück

Der JSON sieht in etwa so aus;

body := []byte(`[ 
    {"name":"Name1", "value":100.00}, 
    {"name":"Name2", "value":200.00} 
]`) 

Ich habe um nach verschiedenen Möglichkeiten gesucht, dies zu tun, aber nicht diese Arbeit zu bekommen. Das Unmarshal liefert Nullwerte. Ich bekomme auch einen Fehler "unerwartetes Ende der JSON-Eingabe" (Ich habe die Fehlerbehandlung im Beispiel entfernt).

Vollcodebeispiel - https://play.golang.org/p/VMdWuAm6HS

Referenz:

  1. https://godoc.org/encoding/json#RawMessage
  2. Golang json Unmarshal "unexpected end of JSON input"
  3. How to unmarshal json into interface{} in golang?

Antwort

1

Ihre Eingabe JSON kann mit einem einfachen []Obj womodelliert werdenist Ihre Art:

type Obj struct { 
    Name string `json:"name"` 
    Value float32 `json:"value"` 
} 

Nichts anderes erforderlich ist, wirklich:

body := []byte(`[ 
    {"name":"Name1", "value":100.00}, 
    {"name":"Name2", "value":200.00}]`) 

var res []Obj 
err := json.Unmarshal(body, &res) 
fmt.Printf("%#v\n%v\n", res, err) 

Ausgabe enthält die Daten aus dem Eingangs JSON (versuchen Sie es auf dem Go Playground):

[]main.Obj{main.Obj{Name:"Name1", Value:100}, main.Obj{Name:"Name2", Value:200}} 
<nil> 

Zurück zu Ihrem Code:

Wo Sie falsch fahren ist, dass Sie dieses Modell verwenden:

type Obj struct { 
    Name string `json:"name"` 
    Value float32 `json:"value"` 
} 

type Result struct { 
    Data json.RawMessage 
} 

var res []Result 

Aber diese res Variable die folgende JSON würde Modell:

[ 
    {"Data":{"name":"Name1", "value":100.00}}, 
    {"Data":{"name":"Name2", "value":200.00}} 
] 

ich Ihnen den Unterschied denken sehen: die Elemente der Array hier sind JSON-Objekte mit einem "Data" Feld, die dann mit Ihrem Obj modelliert werden. Dieser Eingang JSON wird dann mit Ihrem ursprünglichen Parsing-Code richtig analysiert, können Sie es auf den Go Playground versuchen:

[{{"name":"Name1", "value":100.00}} {{"name":"Name2", "value":200.00}}] 
&main.Obj{Name:"Name1", Value:100} 
&main.Obj{Name:"Name2", Value:200} 
+0

Danke für die schnelle Antwort! – multiversed

Verwandte Themen