2015-09-07 6 views
8

私はこの質問が以前に尋ねられたことを知っていました。 JavaとAndroidの私の初心者のスキルのために。私はこの問題を1週間以上解決できません。google gson LinkedTreeMapクラスがmyclassにキャスト

私の友人と私はアンドロイドプロジェクトを開発していますが、このようなことがいくつかあります。

この事の最も奇妙な部分は、私がGoogle Playストアからダウンロードしてテストしたときからだけ起こっていることです。ローカルアンドロイドスタジオのインストールやデバッグモードではありません。

ここで問題になるのは何か、またはこの戻り値のリストは完全に間違っていますか? 私の友人は、このコードが正しく返されると確信していますが、プレイストアのインストールからは常にエラーです。

私はどこで掘り続けるべきですか?

@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.user.User_Test_Mainでcom.gaurage.dto.DoServiceDto にキャストすることはできません.promiseMethod(不明なソース)

+0

私は誰もが私はより多くのコードを投稿する必要があることを教えてください –

+0

週間以上の奇妙な問題が投票されている...私は遊び場のインストールではなく、ローカルインストールでその作品を言った –

+0

質問とコード投票する私の更新された答えを見てください。 –

答えて

34

シリアライズとデシリアライズ汎用型

あなたはtoJson(OBJ)を呼び出すと、Gson CAL ls obj.getClass()は、シリアル化するフィールドに関する情報を取得します。同様に、通常、fromJson(json、MyClass.class)メソッドでMyClass.classオブジェクトを渡すことができます。これは、オブジェクトが非ジェネリック型であれば問題ありません。ただし、オブジェクトが汎用タイプの場合、汎用タイプ情報はJavaタイプ消去のために失われます。そのクラス情報を取得する)Gsonはlist.getClassを(呼び出すため、上記のコードは型バーとして値を解釈することができない

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 

、この方法は、FOO.CLASSを生クラスを返す:ここでのポイントを示す一例です。これは、GsonがこれがFoo型のオブジェクトであり、単純なFooではないことを知る方法がないことを意味します。

ジェネリックタイプに正しいパラメータ化タイプを指定することで、この問題を解決できます。これを行うには、TypeTokenクラスを使用します。

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

私はParentクラスを持ち、その中にList型を持つ子クラスもあります。この親クラスのように私は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時間かかった。 –

関連する問題