我正在尝试读取并解析以数组开头的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<PayoutCharge> mPayoutCharges;
public ArrayList<PayoutCharge> getPayoutCharges() {
return mPayoutCharges;
}
public void setPayoutCharges(ArrayList<PayoutCharge> payoutCharges) {
mPayoutCharges = payoutCharges;
}
}
在阅读@ Ridcully的回复之后,我想问一下我是否有办法更新PayoutCharges.java
以便它知道JSON是一个数组。像@SerializedName([])
?
答案 0 :(得分:29)
下面的代码适用于您的示例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。
答案 1 :(得分:2)
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是一个字符串,其中包含我在此主题中列出的内容 解决方法1:
WellSectionEntity[] listSection = gson.fromJson(***jsonTemp***, WellSectionEntity[].class);
溶液2:
List<WellSectionEntity> sectionlist = gson.fromJson(jsonTemp, new TypeToken<List<WellSectionEntity>>(){}.getType());
感谢DevrimTuncer。
答案 2 :(得分:0)
如果再次将PayoutCharge
个对象的数组定义为类(PayoutCharges
),那么您的JSON应如下所示:
{"error" : <... JSONified Error object>,
"payoutCharges" : [{"test" : "test"}]
}
答案 3 :(得分:-1)
小心gson.fromJson()的第二个参数,它需要一个数组类。例如data [] .class。
答案 4 :(得分:-2)
那是因为对象中第二列的名称和类型与解析后的数据冲突。如果您没有数据中的某个数据,则可以在最后一栏中写入。