预期BEGIN_OBJECT但在第1行第2列路径$是BEGIN_ARRAY

时间:2014-10-20 18:32:40

标签: android gson

我正在尝试读取并解析以数组开头的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([])

这样的东西

5 个答案:

答案 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)

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

image description