2015-01-16 22 views
8

Sto lavorando su un codice per analizzare i dati JSON da una risposta HTTP. Il codice che ho simile a questa:Golang json Unmarshal "Fine imprevista dell'input JSON"

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

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

JSON nella variabile respBytes assomiglia a questo:

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

Tuttavia, err non è pari a zero. Quando lo stampo, dice unexpected end of JSON input. Che cosa sta causando questo? Il JSON sembra valido. Questo errore ha qualcosa a che fare con la mia struttura personalizzata?

Grazie in anticipo!

+0

Come si può leggere in. 'respBytes'? – dyoo

+3

Inoltre, si noti che la minuscola indica la visibilità privata. Si desidera che il nome del campo in' ResultStruct' sia in maiuscolo: altrimenti il ​​decodificatore 'json' non può toccare il campo. .golang.org/p/bATT5uMPRT per un esempio che sembra funzionare, quindi abbiamo bisogno di più informazioni per vedere quale sia il tuo errore: la domanda come detto non ha abbastanza da dire. – dyoo

+0

@dyoo 'respBytes' è solo una matrice di byte (prendo la risposta, faccio un po 'di elaborazione ed estrai il corpo). Ho anche messo in maiuscolo il campo risultato nel 'ResultStruct'. L'esempio del tuo playground Go prende il JSON che ricevo e lo gestisce correttamente, quindi ci deve essere qualcos'altro che non va nel mio codice ... Grazie per il tuo aiuto! – Stratus3D

risposta

3

Il unexpected end of JSON input è il risultato della a syntax error nell'ingresso JSON (probabilmente un missing ", } o ]). L'errore non dipende dal tipo di valore che stai decodificando.

Ho eseguito il codice con l'input JSON di esempio on the playground. Funziona senza errori.

Il codice non decodifica nulla perché il campo result non viene esportato. Se si esporta il campo risultato:

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

poi l'ingresso viene decodificato come mostrato in questa playground example.

Sospetto che non stiate leggendo l'intero corpo della risposta nella vostra applicazione. Suggerisco di decodificare l'input JSON utilizzando:

err := json.NewDecoder(resp.Body).Decode(&jsonData) 

Il decodificatore legge direttamente dal corpo di risposta.

+0

Sospetto che oltre a ciò che @ 3of3 ha detto, tu provi ad analizzare il tuo JSON senza l'ultimo carattere '}'. – kopiczko

+0

Questo ha senso, tuttavia ho stampato il JSON e l'ho eseguito attraverso un validatore online e attraverso l'esempio di @ playground di dyoo e ci è riuscito. Devo concludere che questo errore è dovuto a un problema con un'altra parte del mio codice. Grazie! – Stratus3D

+2

Sì ... Stavo leggendo da un buffer che era vuoto ... – Stratus3D

1

È inoltre possibile ottenere questo errore se si sta utilizzando json.RawMessage in un campo non esportato. Ad esempio, il codice seguente produce lo stesso errore:

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) 
} 

Se si esporta campo "MyJson.bar" (ad esempio -> "MyJson.Bar", quindi il codice funziona

Problemi correlati