Ожидаемый 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([]) ?

Solutions Collecting From Web of "Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY в строке 1 столбец 2 путь $"

Ниже код работает для вашего образца значения 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, над которым вы работаете.

Если вы снова определите массив объектов PayoutCharge как класс ( PayoutCharges ), ваш JSON должен выглядеть примерно так:

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

Введите описание изображения выше, это то, что мне нужно разобрать; Вот моя сущность:

 **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 – это строка, которая включает в себя то, что я называю во главе этого решения:

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

solution2:

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

Спасибо DevrimTuncer.

Будьте осторожны со вторым пармером gson.fromJson (), ему нужен класс массива. Например, data []. Class.

Это связано с тем, что имя и тип второго столбца вашего объекта противоречат анализируемым данным. Если у вас нет данных в данных, вы можете записать их в последнем столбце.

Описание изображения