从String解析时,Gson Long丢失了数据

Dmi*_*pov 5 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;
}
Run Code Online (Sandbox Code Playgroud)

我有json

{ "classItem": "smpb.utility.classes.SMPBBaseObjectsList", "dataItemsClass": "smpb.base.classes.SMPBUser", "dataSliceCode": "012013"​​, "数据":[{ "ID":1374046117510970000"名称 ":" Test3" 的, "classItem": "smpb.base.classes.SMPBUser", "dataSliceCode": "012013"​​}], "过滤器":{ "的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);
Run Code Online (Sandbox Code Playgroud)

系统输出:

BEFORE: {"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"​​,"data":[{ "id":1374044905885298000, "名称": "Test3的", "classItem": "smpb.base.classes.SMPBUser", "dataSliceCode": "012013"​​}], "过滤器":{ "的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而我得到了长期1374044905885297920

为什么?以及如何解决它?

Array中的数据是String map,它已经是所有Long id Double格式.

我尝试registerAdapater for Long或Double但从未触发过.

Gson 2.2.4的版本

UPDATE

这不是问题的重复

如何防止Gson将长号(json字符串)转换为科学记数法格式?

Mik*_*ikO 0

我无法准确说出问题是什么,但您可以通过创建另一个类来解决它,即在代替类Data中使用...我尝试了这段代码,它对我来说工作得很好!ListObject

因此,您需要将ArrayList<Object>您的中的替换SMPBBaseObjectsList为:

public ArrayList<Data> data = new ArrayList<>()
Run Code Online (Sandbox Code Playgroud)

并创建一个像这样的新类:

public class Data {    
    public Long id;
    public String Name;
    public String classItem;
    public String dataSliceCode;
}
Run Code Online (Sandbox Code Playgroud)

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