【问题标题】:Gson Long lost data when parse from String从字符串解析时 Gson Long 丢失数据
【发布时间】:2013-07-17 08:49:56
【问题描述】:

我有一些对象的 json 字符串表示 类对象是

public class SMPBBaseObjectsList {

    public ArrayList<Object> data = new ArrayList<>();
    public Integer count;
    public Integer limitFrom;
    public Integer limitTo;
    public Boolean hasMore;
    public String dataItemsClass;
}

我有 json

{"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","data":[{"id": 1374046117510970000,"名称":"Test3","classItem":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"}],"filter":{"orderItems":[],"filterItems": []}}

我尝试解析这个 json 并使用下一个代码创建我的类的对象:

 String json = "{\"classItem\":\"smpb.utility.classes.SMPBBaseObjectsList\",\"dataItemsClass\":\"smpb.base.classes.SMPBUser\",\"dataSliceCode\":\"012013\",\"data\":[{\"id\":1374046117510970000,\"Name\":\"Test3\",\"classItem\":\"smpb.base.classes.SMPBUser\",\"dataSliceCode\":\"012013\"}],\"filter\":{\"orderItems\":[],\"filterItems\":[]}}";
        SMPBBaseObjectsList list = new GsonBuilder().create().fromJson(json, SMPBBaseObjectsList.class);
        System.out.println("BEFORE:" + json);
        System.out.println("AFTER: " + list);

系统输出:

之前:{"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","数据":[{"id":1374044905885298000,"Name":"Test3","classItem":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"}], "filter":{"orderItems":[],"filterItems":[]}}

之后: {"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","数据":[{"Name":"Test3","id":1.374044905885298011E18,"classItem":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"}] ,"filter":{"orderItems":[],"filterItems":[]}}

正如您在 Json String 中看到的,我的 ID 值为 1374044905885298000,但是当从字符串序列化对象时,我得到 1.374044905885298011E18

问题是Long丢失最后一个零0000的这种表示,我得到了Long 1374044905885297920

为什么?以及如何解决?

Array中的数据是String map,已经是Long id Double格式了。

我尝试将 registerAdapater 用于 Long 或 Double 但从未触发。

Gson 2.2.4 版本

更新

这不是问题的重复

How to prevent Gson from converting a long number (a json string ) to scientific notation format?

【问题讨论】:

标签: java gson


【解决方案1】:

我不能确切地说出问题是什么,但您可以通过创建另一个类来解决它,即Data 用于List 而不是Object 类...我尝试了这段代码并它对我来说很好用!

因此,您需要将SMPBBaseObjectsList 中的ArrayList&lt;Object&gt; 替换为:

public ArrayList<Data> data = new ArrayList<>()

然后像这样创建一个新类:

public class Data {    
    public Long id;
    public String Name;
    public String classItem;
    public String dataSliceCode;
}

我猜在将 JSON 解析为 Object 对象时存在问题,它可能会进行一些转换导致该数字格式,但不幸的是我不是这个 Java 低级问题的专家......
无论如何,使用这段代码,您明确指定您希望将该值解析为Long,所以没有问题!

【讨论】:

  • 我的问题是数据是对象数组,因为它包含不同的类
  • @DmitryNelepov:您始终可以创建包含Array 可以包含的所有类的所有属性的Data 类,并且它将能够解析所有可能的类......或者你可以为该部分创建自定义反序列化器...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多