Json解析问题—数组用Gson反序列化为List双引号消失

目录

实体类对象

Json数据

Gson库解析

错误思路1

错误思路2

正确思路


现在的目的是这样的,我想从一串Object类型的字符串,转化成对应的实体类对象。

简单来说就是把这个字符串给一个个独立分开。

我先写出实体类对象和Json的数据,看完再开始解析。

实体类对象

package com.yyt.accountbooks.db.model;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

/**
 * @ projectName:   AccountBooks
 * @ packageName:   com.yyt.accountbooks.model
 * @ fileName:      BillModel
 * @ author:        zheng
 * @ createTime:    2023/1/11 17:32
 * @ describe:      账本表对象
 */
@Entity(tableName = "bills")
public class BillModel {

    /**
     * balance : 0.0
     * createTime : 1660880757000
     * id : 2
     * income : 0.0
     * name : 账本一
     * params : {}
     * pay : 0.0
     * remark : 账本备注
     * uid : 12
     */
    @PrimaryKey
    private int id;
    private double balance;
    private long createTime;
    private double income;
    private String name;
    private double pay;
    private String remark;
    private int uid;

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public long getCreateTime() {
        return createTime;
    }

    public void setCreateTime(long createTime) {
        this.createTime = createTime;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getIncome() {
        return income;
    }

    public void setIncome(double income) {
        this.income = income;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public double getPay() {
        return pay;
    }

    public void setPay(double pay) {
        this.pay = pay;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    @Override
    public String toString() {
        return "BillModel{" +
                "balance=" + balance +
                ", createTime=" + createTime +
                ", id=" + id +
                ", income=" + income +
                ", name='" + name + '\'' +
                ", pay=" + pay +
                ", remark='" + remark + '\'' +
                ", uid=" + uid +
                '}';
    }
}

Json数据

因为getData()的类型是Object的,获得的是data后面部份的数组,一共有13个数组对象。

string:{"code":0,"data":[{"balance":0.00,"createTime":1660880757000,"id":2,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本备注","uid":12},
{"balance":0.00,"createTime":1673076697000,"id":4,"income":0.00,"name":"pppppp","params":{},"pay":0.00,"remark":"pppppp","uid":12},
{"balance":0.00,"createTime":1673077667000,"id":5,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673077687000,"id":6,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673077696000,"id":7,"income":0.00,"name":"坎坎坷坷看看","params":{},"pay":0.00,"remark":"坎坎坷坷看看","uid":12},
{"balance":0.00,"createTime":1673079793000,"id":8,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673080112000,"id":9,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673080305000,"id":10,"income":0.00,"name":"哈哈哈哈哈那就","params":{},"pay":0.00,"remark":"哈哈哈哈哈那就","uid":12},
{"balance":0.00,"createTime":1673080319000,"id":11,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673080812000,"id":12,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673082156000,"id":13,"income":0.00,"name":"账本一","params":{},"pay":0.00,"remark":"账本一","uid":12},
{"balance":0.00,"createTime":1673086473000,"id":14,"income":0.00,"name":"用英语","params":{},"pay":0.00,"remark":"探讨探讨","uid":12},
{"balance":0.00,"createTime":1673088234000,"id":15,"income":0.00,"name":"滚滚滚","params":{},"pay":0.00,"remark":"","uid":12}]}

Gson库解析

错误思路1

直接把Object类型的Json数据直接反序列化为实体类的数组对象。

BillModel[] billModels =gson.fromJson((responseModel.getData().toString())
                                        ,BillModel[].class);

解析直接错误,解都解不出来.....

至于为什么?

应该是Object类型的数据直接toString不行。


错误思路2

把Object类型的Json数据先序列化为Json再反序列化为List<Object>对象。

目前的思路:用List把每个对象分出来,再用for循环遍历Gson库解析对象的每个属性。先把这data后面这部分toJson序列化为Json对象,在反序列化为一组一组的List<Object>对象。简单来说就是用Gson库序列化一次和反序列化各一次。

//第一次序列化和反序列化
List<Object> list= mGson.fromJson(mGson.toJson(responseModel.getData()),
                                    List.class);
//定义一个List
List<BillModel> billModelList=new ArrayList<>();

//遍历list,对每一项进行第二次反序列化
for(int i=0;i<list.size();i++){
    BillModel model=mGson.fromJson(list.get(i),BillModel.class);
    billModelList.add(model);
    //查看每一项的数据
    KLog.d(list.get(i)+"---------------------------");
}

我的思路结果本应该是这样的一组一组的。

{"balance":0.00,"createTime":1673076697000,
"id":4,"income":0.00,"name":"pppppp","params":{},
"pay":0.00,"remark":"pppppp","uid":12}

结果第二次反序列化打印数据的时候变成了下面这样一组一组!!!这样连Json格式都不是了,还怎么解析!!!

然后编译期间调用实体类的get方法可以,但是结果会出错甚至报错。

至于为什么?

应该是用List第一次解析为Obejct类型会把双引号给去掉,那么此时就不是Json格式了,就不能解析了。

{balance=0.0, createTime=1.660880757E12, id=2.0,
 income=0.0, name=小明, params={}, pay=0.0, remark=备注,
 uid=12.0}

 所以我知道这个办法行不通了,得换一种方法。


正确思路

可以看看用List怎么反序列化的,在我写的下方链接博客里面第四点。

用TypeToken来储存实体类的类型。

https://blog.csdn.net/qFAFAF/article/details/128381598

List<BillModel> list= mGson.fromJson(mGson.toJson(responseModel.getData()),
                                    new TypeToken<List<BillModel>>(){}.getType());

和错误思路2的区别就是:

  1. 我直接转化为BillModel实体类,而不是Object类型的了
  2. 先序列化一次,再进行一次反序列化即可,不需要第二次遍历每一项list进行反序列化
if (BuildConfig.DEBUG) {
    for(int i=0;i<list.size();i++){
        KLog.d(list.get(i).getId()+"---------------------------");
    }
}

此时get()方法也能成功获取到数据了。

而且一般整个app用一个Gson对象就行了,就只需要new一个Gson对象,放在全局变量去用就好了,避免资源浪费。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七qi_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值