我有一些对象的 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,"Name":"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);
系统输出:
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":[]}}
正如您在 Json String 中看到的那样,我的 ID 值为 1374044905885298000 ,但是当从字符串序列化对象时,我得到 1.374044905885298011E18
问题是 Long 的这种表示丢失了最后的零 0000 而我得到了 Long 1374044905885297920
为什么?以及如何修复它?
Array中的数据是String映射,已经都是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?
最佳答案
我不能确切地说出问题是什么,但你可以通过创建另一个类来解决它,即 Data
在 List
中使用而不是 Object
类...我试过这段代码,它对我来说工作正常!
因此,您需要替换 ArrayList<Object>
在你的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
。 ,所以没有问题!
关于java - 从 String 解析时 Gson Long 丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17695242/