java - 从 String 解析时 Gson Long 丢失数据

标签 java gson

我有一些对象的 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?

最佳答案

我不能确切地说出问题是什么,但你可以通过创建另一个类来解决它,即 DataList 中使用而不是 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/

相关文章:

java - 使用 AsyncTask 避免 Android NetworkOnMainThreadException 的挑战

java - Jenkins 上的 Sonarscanner : Could not find 'java' executable in JAVA_HOME or PATH

java - Setter 方法在 JSF 中不起作用

java - 使用GSON解析JSON得到 "content"

java - 使用 GSON 将 Json 解析为 JAVA 对象,其中 Json 元素可能会有所不同

spring-boot - 强制 Spring Boot 使用 Gson 或 Jackson

java - 将具有动态键的嵌套对象映射到 Java 对象

java - 在 javafx 标签中排列文本

Java SE 8 Base64 类 : encoding of byte[] parameter

java - Scala actor 作为参数传递给其他 actor