Gson Long从String解析时丢失了数据 [英] Gson Long lost data when parse from String

查看:107
本文介绍了Gson Long从String解析时丢失了数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

pre code 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​​}], 过滤器:{ 的OrderItems: [],filterItems:[]}}

我尝试解析这个json并用下面的代码创建我的类的对象: / p>

 字符串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);

系统输出:


BEFORE: {classItem:smpb.utility.classes.SMPBBaseObjectsList,dataItemsClass:smpb.base.classes.SMPBUser, dataSliceCode : 012013\" , 数据:[{的 ID:1374044905885298000 下, 名称: Test3的, classItem: smpb.base.classes.SMPBUser,dataSliceCode :012013}],filter:{orderItems:[],filterItems:[]}}

{classItem:smpb.utility.classes.SMPBBaseObjectsList,dataItemsClass:smpb.base.classes.SMPBUser,dataSliceCode:012013​​,data:[{Name: TEST3\" 的 ID:1.374044905885298011E18 下, classItem: smpb.base.classes.SMPBUser, dataSliceCode: 012013​​}], 过滤器:{ 的OrderItems:正如你可以看到在JSON字符串中我有ID值1374044905885298000,但是当对象从字符串序列化我得到1.374044905885298011E18



而问题是这是什么表示龙最后零零丢失,我得到了长1374044905885297920



为什么?以及如何修复它?



数组中的数据是字符串映射,并且它已经是所有Long id双格式。



我尝试registerAdapater为长或双,但从未触发。



Gson 2.2.4版本



更新



这不是问题的重复

如何防止Gson转换长数字(一个JSON字符串)到科学记数法格式?

解决方案

我无法确切地知道问题所在,但您可以解决它通过创建另一个类,即 Data 来用于 List 而不是 Object class ...我试过这段代码,它对我来说工作的很好!



所以,你需要替换 ArrayList< ;对象> SMPBBaseObjectsList 中:

  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 ,所以没有问题!


I have json string represenatation of some object class objects is

public class SMPBBaseObjectsList {

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

And i have 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":[]}}

I try parse this json and create object of my class with next code:

 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);

System outputs:

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

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

As u can see in Json String i have ID with value 1374044905885298000 , but when object serialized from string i got 1.374044905885298011E18

And problem is what this representation of Long lost last zeros 0000 and i got Long 1374044905885297920

Why? and how fix it?

Data in Array is String map, and it's already all Long id Double format.

I try registerAdapater for Long or Double but never triggered.

Version of Gson 2.2.4

UPDATE

It's not duplicate of question

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

解决方案

I can't tell exactly what the problem is, but you can solve it by creating another class, i.e. Data to use in the List instead of the Object class... I tried this code and it's working fine for me!

So, you need to replace the ArrayList<Object> in your SMPBBaseObjectsList by:

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

And create a new class like this:

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

I guess there's an issue when parsing the JSON to an Object object, it probably makes some conversion that leads to that number formatting, but unfortunately I'm not an expert in this Java low-level issues...
Anyway, with this code you are explicitly specifying that you want that value parsed into a Long, so there's no problem!

这篇关于Gson Long从String解析时丢失了数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆