2016-03-24 5 views
-1

Ich versuche, die folgende JSON zu analysieren:Android Gson Erwartet BEGIN_ARRAY aber war BEGIN_OBJECT in Zeile 1 Spalte 2

{ 
    "Message": "The request is invalid.", 
    "ModelState": { 
    "": [ 
     "Name [email protected] is already taken.", 
     "Email '[email protected]' is already taken." 
    ] 
    } 
} 

Der Code i verwendet:

ErrorRequest page = gson.fromJson(response.getResponseString(), ErrorRequest.class); 

Aber ich erhalte die Fehlermeldung: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartete BEGIN_ARRAY aber war BEGIN_OBJECT in Zeile 1 Spalte 2

Meine POJO Klassen sind: ErrorRequest.Java

package com.devinedesign.cleanride.domain; 

import com.google.gson.annotations.SerializedName; 

import java.util.ArrayList; 
import java.util.List; 

public class ErrorRequest 
{ 
    @SerializedName("Message") 
    private String message; 

    @SerializedName("ModelState") 
    private List<ModelState> modelState; 

    public ErrorRequest(String message,List<ModelState> modelState) 
    { 
     this.message = message; 
     this.modelState = modelState; 
    } 

    public String getMessage() 
    { 
     return message; 
    } 

    public void setMessage(String message) 
    { 
     this.message = message; 
    } 

    public List<ModelState> getModelState() 
    { 
     return modelState; 
    } 

    public void setModelState(List<ModelState> modelState) 
    { 
     this.modelState = modelState; 
    } 
} 

ModelState.Java

package com.devinedesign.cleanride.domain; 

import com.google.gson.annotations.SerializedName; 


public class ModelState 
{ 
    @SerializedName("ModelState") 
    private String modelState; 

    public ModelState(String modelState) 
    { 
     this.modelState = modelState; 
    } 

    public String getModelState() { 
     return modelState; 
    } 

    public void setModelState(String modelState) { 
     this.modelState = modelState; 
    } 
} 
+1

Soll Ihr JSON eine leere Schlüsselzeichenfolge vor dem Array haben? –

+0

Nun, mein Klient hat mir das in seiner API zur Verfügung gestellt. Ist das der Grund, warum ich den Fehler bekommen habe? – aaa111

+0

Es soll wohl eher wie '{ "Message": "Die Anforderung ist ungültig.", "Model": "an. Name [email protected] ist bereits vergeben"[ , „E-Mail ‚c @ gmail. com 'ist bereits vergeben. " ] } '. Der leere Schlüssel scheint nur eine ziemlich einfache JSON-Antwort zu abstrahieren. – zgc7009

Antwort

2

Model hier ist ein Objekt.

Sie haben es jedoch als Liste deklariert, also versucht Gson ein Array zu parsen.

@SerializedName("ModelState") 
private List<ModelState> modelState; 

können Sie beheben, die mit

@SerializedName("ModelState") 
private ModelState modelState; 

Aber dann sollten Sie vorsichtig sein, wie dies analysiert wird .. Das wird ein Objekt mit einem List<String> sein, aber das leere Schlüssel sollte eine haben Wert darin. Außer vielleicht können Sie @SerializedName("") tun, aber ich bin mir nicht sicher.

{ 
    "": [ 
     "Name [email protected] is already taken.", 
     "Email '[email protected]' is already taken." 
    ] 
} 
1

Ok ich mein Problem endgültig fixiert, und mein Mandant die JSON aktualisiert mit Format folgenden

{"Message":"The request is invalid.","ModelState":{"Errors":["Name [email protected] is already taken.","Email '[email protected]' is already taken."]}} 

und danach habe ich geändert meine POJO ist in folgender Weise:

ErrorRequest.Java

package com.devinedesign.cleanride.domain; 

import com.google.gson.annotations.SerializedName; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

public class ErrorRequest 
{ 
@SerializedName("Message") 
private String message; 

@SerializedName("ModelState") 
private ModelState modelState; 

public ErrorRequest(String message,ModelState modelState) 
{ 
    this.message = message; 
    this.modelState = modelState; 
} 

public String getMessage() 
{ 
    return message; 
} 

public void setMessage(String message) 
{ 
    this.message = message; 
} 

public ModelState getModelState() 
{ 
    return modelState; 
} 

public void setModelState(ModelState modelState) 
{ 
    this.modelState = modelState; 
} 
} 

ModellState.java

package com.devinedesign.cleanride.domain; 

import com.google.gson.annotations.SerializedName; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 


public class ModelState 
{ 
@SerializedName("Errors") 
private List<String> errors; 

public ModelState(ArrayList<String> errors) 
{ 
    this.errors = errors; 
} 

public List<String> getErrors() { 
    return errors; 
} 

public void setErrors(List<String> errors) { 
    this.errors = errors; 
} 
} 

Jetzt funktioniert alles perfekt.

Verwandte Themen