2014-10-20 5 views
19

Ich versuche, eine JSON-Zeichenfolge, die als Array beginnt zu lesen und zu analysieren (zB [{test: "test"}]) und ich immer laufen in den Fehler:

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ 

Die Fehler in meinem Logpunkte auf dieser Linie:

Gson gson = new GsonBuilder().create(); 
PayoutCharges payoutList = gson.fromJson(reader, PayoutCharges.class); 

einige Antworten nach Stackoverflow, habe ich die PayoutCharges Klasse als Array Liste der PayoutCharge. Wie behebe ich dieses Problem, damit GSON weiß, dass die JSON-Zeichenfolge in einem Array ist?

PayoutCharges.java

package com.app.driver.entity; 

import java.util.ArrayList; 

import com.google.gson.annotations.SerializedName; 

public class PayoutCharges { 
    //handle error 
    @SerializedName("error") 
    private Error mError; 

    public Error getError() { 
     return mError; 
    } 

    public void setError(Error error) { 
     mError = error; 
    } 

    //handle data 
    @SerializedName("payoutCharges") 
    private ArrayList<PayoutCharge> mPayoutCharges; 

    public ArrayList<PayoutCharge> getPayoutCharges() { 
     return mPayoutCharges; 
    } 

    public void setPayoutCharges(ArrayList<PayoutCharge> payoutCharges) { 
     mPayoutCharges = payoutCharges; 
    } 
} 

Nach @ Ridcully Antwort zu lesen, möchte ich eine Möglichkeit für mich, wenn es fragen, ist PayoutCharges.java so zu aktualisieren, dass sie weiß, dass die JSON ein Array ist. So etwas wie @SerializedName([])?

Antwort

25

Below-Code für Ihre Probe json Wert funktioniert:

String val1 = "[{test: \"test\"}]"; 

final GsonBuilder gsonBuilder = new GsonBuilder(); 
final Gson gson = gsonBuilder.create(); 

TestCase[] testCase = gson.fromJson(val1, TestCase[].class); 

Die Klasse Testhalter:

private static class TestCase { 
    @SerializedName("test") 
    private String field; 
} 

Das Testbeispiel, das Sie freigegeben haben, hat ein Array mit Objekten. Sie müssen also ein Array Ihrer Pojo-Klasse verwenden, während Sie den JSON-Wert für ein Objekt (Array) deserialisieren.

Wenn diese Antwort Ihnen nicht hilft (was bedeutet, dass Sie etwas anderes auf Ihrem realen JSON-Wert haben), sollten Sie besser den echten JSON teilen, an dem Sie arbeiten.

+0

Tuncer Sie haben meinen Tag gerettet. Danke für die Lösung – PPD

+0

Einfach, aber tolles Beispiel, das mein Problem behoben! Danke – RoDo

+0

Vielen Dank, es funktioniert –

0

Wenn Sie das Array von PayoutCharge Objekte wieder als Klasse (PayoutCharges) definieren, sollten Sie Ihre JSON wie folgt aussehen:

{"error" : <... JSONified Error object>, 
"payoutCharges" : [{"test" : "test"}] 
} 
+0

gibt es eine Möglichkeit für mich, die JSON zu halten, wie (der iOS-App auch die JSON-Antwort verwendet, damit ich es zu vermeiden, habe die Manipulation)? – Huy

-1

Seien Sie vorsichtig mit dem zweiten Parameter von gson.fromJson(), es benötigt eine Klasse von Array.Zum Beispiel data []. Class.

+0

Während richtig, dies fügt nichts weiter als die bereits angenommene Antwort, die viel ausführlicher ist. Versuchen Sie, eine neuere Frage zu beantworten, idealerweise eine, die noch nicht beantwortet wurde. – Benjamin

0

enter image description here oben ist, was ich analysieren muss; hier ist meine Einheit:

**package com.winway.ecloud.data.entity; 

import java.util.List; 


public class WellSectionEntity { 


     private String name;  

     private String picture; 

     private String remark; 

     private List<Point> pos;  

     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public String getPicture() { 
      return picture; 
     } 
     public void setPicture(String picture) { 
      this.picture = picture; 
     } 
     public String getRemark() { 
      return remark; 
     } 
     public void setRemark(String remark) { 
      this.remark = remark; 
     } 
     public List<Point> getPos() { 
      return pos; 
     } 
     public void setPos(List<Point> pos) { 
      this.pos = pos; 
     } 

} 
package com.winway.ecloud.data.entity; 


public class Point { 
    public float x;// 
    public float y;// 
    public float circleR = 50;// 
    public float r;// 
    private String lineNO;// 
    private String lineName;// 
    private String no;// 
    private int deep;// 


    public float getX() { 
     return x; 
    } 

    public void setX(float x) { 
     this.x = x; 
    } 

    public float getY() { 
     return y; 
    } 

    public void setY(float y) { 
     this.y = y; 
    } 

    public float getR() { 
     return r; 
    } 

    public float getCircleR() { 
     return circleR; 
    } 

    public void setCircleR(float circleR) { 
     this.circleR = circleR; 
    } 

    public void setR(float r) { 
     this.r = r; 
    } 

    public String getLineNO() { 
     return lineNO; 
    } 

    public void setLineNO(String lineNO) { 
     this.lineNO = lineNO; 
    } 

    public String getLineName() { 
     return lineName; 
    } 

    public void setLineName(String lineName) { 
     this.lineName = lineName; 
    } 

    public String getNo() { 
     return no; 
    } 

    public void setNo(String msg) { 
     this.no = msg; 
    } 

    public int getDeep() { 
     return deep; 
    } 

    public void setDeep(int deep) { 
     this.deep = deep; 
    } 
} 

final GsonBuilder gsonBuilder = new GsonBuilder(); 
     final Gson gson = gsonBuilder.create(); 

jsonTemp ist ein String, die Folgendes umfassen, was ich an der Spitze dieser dieser arcticle Liste solution1:

WellSectionEntity[] listSection = gson.fromJson(***jsonTemp***, WellSectionEntity[].class); 

Solution2:

List<WellSectionEntity> sectionlist = gson.fromJson(jsonTemp, new TypeToken<List<WellSectionEntity>>(){}.getType()); 

danke DevrimTuncer.

-2

Das liegt daran, dass der Name und der Typ der zweiten Spalte in Ihrem Objekt in Konflikt mit den analysierten Daten stehen. Wenn Sie keine der Daten in den Daten haben, können Sie sie in die letzte Spalte schreiben.

image description

+0

Statt eines Screenshot, ist es besser, den Code als Text in einem schaffen Codeblock –

+0

或者 你 可以 检查 一下 符号 是否 正确 比如 „[[“ 的 错误 符号 Oder Sie können überprüfen, ob die richtigen Symbole, wie „frei "Fehlersymbol – keinta

Verwandte Themen