gson 需要开始_OBJECT,但在路径$的第1行第2列却是BEGIN_ARRAY

webghufk  于 2022-11-06  发布在  其他
关注(0)|答案(6)|浏览(198)

我尝试读取和解析一个以数组开头的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字符串在数组中?

支出费用.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([])

9avjhtql

9avjhtql1#

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

vlf7wbxs

vlf7wbxs2#

上面的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是一个字符串,它包含了我在本文开头列出的内容***solution 1:

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

解决方案2:

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

谢谢德弗林·唐瑟。

alen0pnh

alen0pnh3#

您可以在Retrofit中通过简单更改Api接口来解决此问题。您只需要编辑您的Call〈〉
之前:

打电话

将此编辑到:

打电话

只需将响应编码成列表,您的问题就会得到解决。

jhiyze9q

jhiyze9q4#

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

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

efzxgjgh5#

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

cqoc49vn

cqoc49vn6#

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

相关问题