预计BEGIN_OBJECT但在第1行第2列路径$是BEGIN_ARRAY

我试图读取并解析一个以数组开头的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); 

在一些stackoverflow答案之后,我创建了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 mPayoutCharges; public ArrayList getPayoutCharges() { return mPayoutCharges; } public void setPayoutCharges(ArrayList payoutCharges) { mPayoutCharges = payoutCharges; } } 

在阅读@ Ridcully的回复之后,我想问一下我是否有办法更新PayoutCharges.java以便它知道JSON是一个数组。 像@SerializedName([])类的东西?

下面的代码适用于您的示例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。

在上面输入图像描述是我需要解析的; 这是我的实体:

 **package com.winway.ecloud.data.entity; import java.util.List; public class WellSectionEntity { private String name; private String picture; private String remark; private List 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 getPos() { return pos; } public void setPos(List 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是一个String,它包括我在这个arcticle解决方案1 的头部列出的内容

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

溶液2:

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

感谢DevrimTuncer。

如果您再次将PayoutCharge对象数组定义为类( PayoutCharges ),您的JSON应如下所示:

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

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

那是因为对象中第二列的名称和types与解析的数据冲突。 如果数据中没有其中一个数据,则可以在最后一列中写入。

图片描述