[Java] gson反序列化(json字符串转对象)遇到空对象/空数组的解决方法

com.google.gson.JsonSyntaxException:Java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT
在这里插入图片描述

在使用gson反序列化到Java对象时遇到以上问题。
直译就是gson在反序列化时期待的是BEGIN_ARRAY([)这个字符,但是收到的却是BEGIN_OBJECT({)

debug时把对应的字符串粘贴出来,找到错误信息中所写的列数。

我的第一反应是反序列化生成json的javabean时生成错了,我又重新在网页工具中生成了一次javabean。但是发现还是有问题

正常的数据结构是这样
在这里插入图片描述
但是其中有一些例外情况。
在这里插入图片描述
如图反序列化时simple对象中的属性没有了。所以本该解析成对象但是,只能解析为空数组

网上查找解决方案后,发现可以继承TypeAdapter类,并重写write(序列化)和read(反序列化)方法解决。
在这里插入图片描述
Simple实体类代码

public class Simple {

    private String tag;
    private String enText;
    private String chText;

	以及getter和setter等方法
}

重新反序列化方法

public class SimpleTypeAdapter extends TypeAdapter<Simple> {

    /**
     * * 流式序列化(速度快),将序列化后的值写到流对象中
     */
    @Override
    public void write(JsonWriter out, Simple value) throws IOException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        out.beginObject(); //流式序列化成对象开始
        out.name("chText").value(value.getChText());
        out.name("enText").value(value.getEnText());
        out.name("tag").value(dateFormat.format(value.getTag()));//格式化日期输出
        out.endObject(); //流式序列化结束
    }

    /**
     * 反序列化,从json流对象中读取
     */
    @Override
    public Simple read(JsonReader in) throws IOException {
        Simple simple = new Simple();
        if (in.peek() == JsonToken.BEGIN_ARRAY) {

            in.beginArray();

            if (in.peek() == JsonToken.BEGIN_OBJECT) {
                in.beginObject();
                while (in.hasNext()) {
                    switch (in.nextName()) {
                        case "tag":
                            simple.setTag(in.nextString());
                            break;
                        case "chText":
                            simple.setChText(in.nextString());
                            break;
                        case "enText":
                            simple.setEnText(in.nextString());
                            break;
                    }
                }
                in.endObject();
            }
            if (in.peek() == JsonToken.END_ARRAY) {
                in.endArray();
            }
        }
        return simple;
    }
}

但是这种方法最后还没有成功,因为这个json字符串还有很多其他问题,不整齐。

另外经前辈提醒,我只是用其中某一个字段。所以不一定非要使用对象完整的反序列化出来。可以通过JsonObject和JsonArray直接读想要的属性值机壳

最后通过JsonObject和JsonArray得到了想要的结果。

参考

https://blog.csdn.net/Ever69/article/details/86469320

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值