Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY в строке 1 столбец 2 путь $
Я пытаюсь прочитать и разобрать строку 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([])
?
Ответы
Ответ 1
Ниже код работает для вашего образца значения 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;
}
В приведенном ниже примере теста есть массив, в котором есть объекты. Таким образом, вы должны использовать массив своего класса pojo, десериализируя значение json для объекта (массива).
Если этот ответ вам не поможет (что означает, что у вас что-то отличное от вашего реального значения json), вам лучше поделиться реальным json, над которым вы работаете.
Ответ 2
Если вы снова определите массив объектов PayoutCharge
как класс (PayoutCharges
), ваш JSON должен выглядеть примерно так:
{"error" : <... JSONified Error object>,
"payoutCharges" : [{"test" : "test"}]
}
Ответ 3
введите описание изображения здесь
выше - это то, что мне нужно разобрать;
вот моя сущность:
**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 - это строка, которая включает в себя то, что я перечисляю во главе этой статьи
solution1:
WellSectionEntity[] listSection = gson.fromJson(***jsonTemp***, WellSectionEntity[].class);
solution2:
List<WellSectionEntity> sectionlist = gson.fromJson(jsonTemp, new TypeToken<List<WellSectionEntity>>(){}.getType());
спасибо DevrimTuncer.
Ответ 4
Будьте осторожны с вторым пармером gson.fromJson(), ему нужен класс массива. Например, данные []. class.
Ответ 5
Это потому, что имя и тип второго столбца в вашем объекте противоречат анализируемым данным. Если у вас нет данных в данных, вы можете записать их в последнем столбце.
![image description]()