2014-10-20 143 views
19

我试图读取并解析其开始作为一个数组JSON字符串(如[{test: "test"}])和我一直运行到错误:

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

的错误在我的日志指向该行:

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

经过一些计算器的答案,我创建了PayoutCharges类作为PayoutCharge数组列表。 如何解决此问题,以便GSON知道JSON字符串在数组内?

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

阅读@ Ridcully的响应后,我想问问,如果有对我更新PayoutCharges.java,这样它知道JSON是一个数组的方式。像@SerializedName([])

回答

25

下面的代码适用于您的样品JSON值:

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

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

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

TestCase持有人类别:

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

您共享的测试示例具有包含对象的数组。所以你必须在将json值反序列化为一个对象(数组)的同时使用pojo类的数组。

如果这个答案对您没有帮助(这意味着您的真实json值有所不同),您应该更好地分享您正在使用的真正的json。

+0

Tuncer你救了我的一天。感谢您的解决方案 – PPD 2015-03-14 07:06:57

+0

简单但很好的例子,这解决了我的问题!,谢谢 – RoDo 2016-02-17 12:30:49

+0

谢谢你的工作 – 2017-09-26 11:56:32

0

如果再次定义PayoutCharge对象的数组作为一个类(PayoutCharges),你的JSON应该是这个样子:

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

是有我的方式,以保持JSON作为是(iOS应用也使用JSON响应,所以我必须避免操纵它)? – Huy 2014-10-20 18:46:10

-1

要小心gson.fromJson()的第二个参数,它需要一个数组类。例如data []。class。

+0

虽然是正确的,但这并没有比已经接受的答案增加任何东西,这更加详细。尝试回答最近的问题,理想情况下还没有回答。 – Benjamin 2016-07-06 12:32:28

0

enter image description here 以上是我需要解析的; 这里是我的实体:

**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是一个字符串,其中包含我列出这个本arcticle的头 解决方法1:

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

溶液2:

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

谢谢DevrimTuncer。

-2

这是因为对象中第二列的名称和类型与解析的数据发生冲突。如果您没有数据中的某个数据,可以将其写入最后一列。

image description

+0

而不是屏幕截图,最好是将代码作为文本提供给代码块 – 2016-08-30 09:17:28

+0

或者您可以检查一下符号是否正确,比如“[[”的错误符号 或者您可以检查是否有正确的符号,例如“free “错误符号 – keinta 2016-08-30 09:21:52

相关问题