2015-09-07 55 views
8

我知道這個問題已被問過。由於我在java和android的新手技能。我無法解決這個問題超過一個星期。谷歌gson LinkedTreeMap類投到myclass

我的一位朋友和我正在開發一個android項目,這裏有一些事情。

這件事最奇怪的部分是,它只發生在我從Google Play商店下載並測試它時。不是從本地android studio安裝或調試模式。

這裏有什麼問題,或者這個返回的列表是完全錯誤的? 我的朋友說服這段代碼正確地返回,但是從遊戲商店安裝它始終是一個錯誤。

請建議我應該在哪裏繼續挖掘?

@Override 
public void promiseMethod(JSONObject object) { 
    if (object != null) { 

     if (object.has(DO_SERVICES)) { 
      vehicleDetails = new ArrayList <Object[]> (1); 
      List <String> vehicleNoList = new ArrayList <String> (1); 
      List <String> serviceList = new ArrayList <String> (1); 
      try { 
       Gson gson = new Gson(); 
       JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES) 
        .toString()); 
       servDto = gson.fromJson(jsonObj.toString(), 
        ServiceDto.class); 


       if (servDto.getServiceDto() instanceof List) { 

        List <DoServiceDto> doServiceList = servDto.getServiceDto(); 

例外是

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap不能轉換到com.gaurage.dto.DoServiceDto 在com.gaurage.user.User_Test_Main .promiseMethod(來源不明)

+0

請給我推薦任何人我需要發佈更多的代碼 –

+0

奇怪的問題超過一週,並一直下來投票...我說它的作品在本地安裝不從遊戲存儲安裝 –

+0

請理解以前的問題和代碼下來投票。看看我更新的答案。 –

回答

34

序列化和反序列化泛型類型

當你調用的toJSON(OBJ),GSON CAL ls obj.getClass()獲取有關要序列化的字段的信息。同樣,您通常可以在fromJson(json,MyClass.class)方法中傳遞MyClass.class對象。如果對象是非泛型類型,這工作正常。但是,如果對象是泛型類型,那麼由於Java類型擦除,泛型類型信息會丟失。這裏是表示點的例子:

class Foo<T> { T value;} 
Gson gson = new Gson(); 
Foo<Bar> foo = new Foo<Bar>(); 
gson.toJson(foo); // May not serialize foo.value correctly 
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar 

上述代碼失敗,因爲GSON調用list.getClass()來獲得它的類的信息以解譯值作爲類型欄,但此方法返回一個原始類,讓Foo.class 。這意味着Gson無法知道這是Foo類型的對象,而不僅僅是普通的Foo。

您可以通過爲您的泛型指定正確的參數化類型來解決此問題。您可以通過使用TypeToken類來完成此操作。

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();  
gson.toJson(foo, fooType); 
gson.fromJson(json, fooType); 

我有父類,它是子類,其中一些子類具有列表類型。像這個父類一樣,我有30個文件。我像這樣解決了它。

Gson gson = new Gson(); 
JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString()); 
Type type = new TypeToken<MyDto>() {}.getType(); 
servDto = gson.fromJson(jsonObj.toString(),type); 

最重要的事情是,我無法從Android的工作室本地測試重現此錯誤。此問題只會彈出,當我生成已簽名的apk並將應用程序發佈到PlayStore時,應用程序會停止,並且報告顯示無法將LinkedTreeMap投射到myclass。

我很難在我的本地測試(包括調試模式)中重現相同的結果。

+1

,爲我工作,謝謝:) –

+2

使用proguard時再現(minifyEnabled true) – Pnemonic

+1

@ Log.d謝謝,這對我有效。我花了6個小時才發現問題並發現了你的帖子。 –