Gson Long从String解析时丢失了数据 [英] Gson Long lost data when parse from 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 theList
instead of theObject
class... I tried this code and it's working fine for me!So, you need to replace the
ArrayList<Object>
in yourSMPBBaseObjectsList
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 aLong
, so there's no problem!这篇关于Gson Long从String解析时丢失了数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!