Подтвердить что ты не робот

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

4b9b3361

Ответ 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