2013-07-17 55 views
4

解析我有一些對象 類對象的JSON字符串represenatation是GSON龍丟失的數據時,從字符串

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」​​, 「數據」:[{ 「ID」:1374046117510970000 「名稱」: 「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 ,「數據項」,「數據項目類別」,「數據項目類別」,「數據項目」,「數據項目」,「數據項目」,「數據項目」,「數據項目」,「數據項目」,「數據項目」,「數據項目」 「classItem」:「smpb.base.classes.SMPBUser 「 」dataSliceCode「: 」012013「}], 」過濾器「:{ 」的OrderItems「:[], 」filterItems「:[]}}

AFTER: { 」classItem「:」 smpb.utility。 ,「數據」:[{「Name」:「Test3」,「id」:1.374044905885298011E18, 「classItem」: 「smpb.base.classes.SMPBUser」, 「dataSliceCode」: 「012013」​​}], 「過濾器」:{ 「的OrderItems」:[], 「filterItems」:[]}}

正如你可以看到在JSON字符串中,我的ID值爲1374044905885298000,但是當對象從字符串序列化後我得到了1.374044905885298011E18

問題是什麼這種表示形式丟失了​​最後的零0000,我得到了長1374044905885297920

爲什麼?以及如何解決它?

數組中的數據是字符串映射,它已經是所有Long id雙格式。

我嘗試registerAdapater長或雙但從未觸發。 GSON 2.2.4

版本

UPDATE

這不是重複的問題

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

+0

[如何防止Gson將長數字(一個json字符串)轉換爲科學記數法格式?](http://stackoverflow.com/questions/11586299/how-to-prevent-gson-from-轉換成一個長號碼的json-string-to-scientific) – 2013-07-17 08:56:38

+0

不是。如果你閱讀了一個用戶,你會發現它不是解串的解決方案,這是合理的STRING表示。但如果你嘗試反序列化JsonElement jsonElement = jsonParser.parse(json);上課你得到我的錯誤。 –

+0

要修復它,你可以寫一個自定義的反序列化器類。看看這裏:http://stackoverflow.com/questions/5845822/gson-deserializing-key-value-to-custom-object – gawi

回答

0

我不能告訴正是問題是什麼,但可以解決它通過創建另一個類,即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,所以沒有問題!

+0

我的問題是,數據是對象的數組,因爲它containts不同類 –

+0

@DmitryNelepov:你總是可以創建包含'Array'可以包含的所有類的所有屬性的'Data'類,它將能夠解析所有可能的類...或者您可以爲該部分創建一個自定義解串器... – MikO