2015-01-16 10 views
8

Ich arbeite an etwas Code, um die JSON-Daten von einer HTTP-Antwort zu analysieren. Der Code habe ich in etwa so aussieht:Golong json Unmarshal "unerwartetes Ende der JSON-Eingabe"

type ResultStruct struct { 
    result []map[string]string 
} 

var jsonData ResultStruct 
err = json.Unmarshal(respBytes, &jsonData) 

Die json in der respBytes Variable wie folgt aussieht:

{ 
"result": [ 
    { 
    "id": "ID 1" 
    }, 
    { 
    "id": "ID 2" 
    } 
] 
} 

jedoch err ist nicht gleich Null. Wenn ich es ausdrücke, sagt es unexpected end of JSON input. Was verursacht das? Der JSON scheint gültig zu sein. Hat dieser Fehler etwas mit meiner benutzerdefinierten Struktur zu tun?

Vielen Dank im Voraus!

+0

Wie lesen Sie in. 'respBytes'? – dyoo

+3

Beachten Sie außerdem, dass Kleinbuchstaben private Sichtbarkeit anzeigen.Sie möchten, dass der Feldname in Ihrem' ResultStruct' groß geschrieben wird: andernfalls darf der 'json'-Decoder das Feld nicht berühren. Siehe: http: // play Englisch: www.goecke.de/us/default.asp?Page=d...ID=&Webcode = So brauchen wir mehr Informationen, um zu sehen, was Ihr Fehler ist: Die Frage, wie gesagt, hat nicht genug zu sagen: – dyoo

+0

@dyoo 'respBytes' ist nur ein Array von Bytes (Ich nehme die Antwort, mache etwas Verarbeitung und extrahiere der Körper). Ich habe auch das Ergebnisfeld in 'ResultStruct' großgeschrieben. Ihr Go-Spielplatzbeispiel nimmt den JSON, den ich erhalte, und behandelt ihn richtig, also muss irgendetwas anderes mit meinem Code falsch sein ... Danke für Ihre Hilfe! – Stratus3D

Antwort

3

Die unexpected end of JSON input ist das Ergebnis der im a syntax error JSON Eingang (wahrscheinlich eine fehlende ", } oder ]). Der Fehler hängt nicht vom Typ des Werts ab, zu dem Sie dekodieren.

Ich lief den Code mit dem Beispiel JSON-Eingang on the playground. Es läuft ohne Fehler.

Der Code decodiert nichts, da das Feld result nicht exportiert wird. Wenn Sie das Ergebnis Feld exportieren:

type ResultStruct struct { 
    Result []map[string]string 
} 

dann wird der Eingang decodiert, wie in diesen playground example gezeigt.

Ich vermute, dass Sie nicht den gesamten Antworttext in Ihrer Anwendung lesen. Ich empfehle, den JSON-Eingang zu dekodieren mit:

Der Decoder liest direkt aus dem Antworttext.

+0

Ich vermute, dass Sie neben dem, was @ 3 von 3 gesagt hat, versuchen, Ihren JSON ohne letzten '}' zu parsen. – kopiczko

+0

Das macht Sinn, aber ich druckte den JSON aus und führte ihn durch einen Online-Validator sowie durch @ dyoos Go-Spielplatz-Beispiel und es war erfolgreich. Ich muss daraus schließen, dass dieser Fehler auf ein Problem mit einem anderen Teil meines Codes zurückzuführen ist. Vielen Dank! – Stratus3D

+2

Yep ... Ich las aus einem Puffer, der leer war ... – Stratus3D

1

Sie können diesen Fehler auch erhalten, wenn Sie json.RawMessage in einem nicht exportierten Feld verwenden. Zum Beispiel der folgende Code den gleichen Fehler erzeugt:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type MyJson struct { 
    Foo bool `json:"foo"` 
    bar json.RawMessage `json:"bar"` 
} 

type Bar struct { 
    X int `json:"x"` 
} 

var respBytes = []byte(` 
{ 
    "foo": true, 
    "bar": { "x": 10 } 
}`) 

func main() { 
    var myJson MyJson 
    err := json.Unmarshal(respBytes, &myJson) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    myBar := new(Bar) 
    err = json.Unmarshal(myJson.bar, myBar) 
    fmt.Println(err) 
} 

Wenn Sie exportieren "MyJson.bar" Feld (zB -> "MyJson.Bar", dann funktioniert der Code