3

Gsonクラスを使用してJSON文字列データをIntentオブジェクトに変換しています。しかし、私は例外を得ています。

インテントのJSON文字列:

{
   "targetIntent":{
      "mAction":"android.intent.action.VIEW",
      "mData":{
         "authority":{
            "decoded":"com.android.contacts",
            "encoded":"com.android.contacts"
         },
         "fragment":{

         },
         "path":{
            "decoded":"NOT CACHED",
            "encoded":"/contacts/lookup/1471i541ce89b89ad6a59"
         },
         "query":{

         },
         "scheme":"content",
         "uriString":"NOT CACHED",
         "host":"NOT CACHED",
         "port":-2
      },
      "mFlags":0
   }
}

変換コード:

Intent targetIntent =
    gson.fromJson(histroyDataObject.getString("targetIntent"), Intent.class);

これは例外を与えます:

Cause: Instantiation Exception
Detail Message: Failed to invoke private android.net.Uri() with no args

スタックトレース:

08-31 01:08:19.045: W/System.err(290): Caused by: java.lang.InstantiationException: android.net.Uri
08-31 01:08:19.065: W/System.err(290):  at java.lang.reflect.Constructor.constructNative(Native Method)
08-31 01:08:19.065: W/System.err(290):  at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
08-31 01:08:19.065: W/System.err(290):  at com.google.gson.internal.ConstructorConstructor$2.construct(ConstructorConstructor.java:91)
08-31 01:08:19.076: W/System.err(290):  ... 24 more

ご協力いただきありがとうございます。

4

2 に答える 2

2

私の賭けは、引数なしのパブリックコンストラクターを持たないIntent#uriStringタイプです。android.net.Uri私はあなたがJsonDeserializer<Uri>このように書かなければならないことを意味します:

public class UriDeserializer implements JsonDeserializer<Uri> {
  @Override
  public Uri deserialize(final JsonElement src, final Type srcType,
      final JsonDeserializationContext context) throws JsonParseException {
    return Uri.parse(src.getAsString());
  }
}

次に、次の方法で登録しGsonBuilderます。

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Uri.class, new UriDeserializer())
    .create();

編集:

プロパティでパブリックno-argコンストラクターが定義されていない場合は、カスタムアダプターを登録する必要があります。詳細については、Gsonドキュメント-カスタムシリアル化と逆シリアル化を参照してください。

于 2012-08-30T20:20:28.663 に答える
2

私はAndroidの開発に精通していませんが、android.net.Uriクラスのソースコードを見るとhttp://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/ 2.1_r2 / android / net / Uri.java /?v=source抽象クラスであることがわかります。したがって、これがおそらく失敗する主な理由です。これを機能させるには、カスタムTypeAdapterを作成し、AndroidURIクラスのparseメソッドを使用する必要があります。

Gensonライブラリhttp://code.google.com/p/genson/もご覧ください。それは素晴らしい機能とパフォーマンスを持っています。さらに、gson(200K)と同じくらいの重みがあります。あなたの問題に対するGensonの例:

class AndroidURIDeserializer implements Deserializer<Uri> {
    public Uri deserialize(ObjectReader reader, Context ctx) throws TransformationException,
            IOException {
        return Uri.parse(reader.valueAsString());
    }
}

Genson genson = new Genson.Builder().withDeserializers(new AndroidURIDeserializer()).create();
Intent pojo = genson.deserialize(json, Intent.class);
于 2012-08-30T20:40:04.107 に答える