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();

编辑:

您必须注册自定义适配器,以防任何属性未定义公共无参数构造函数。您可以在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 并使用 parse 方法来处理 android URI 类。

您还可以查看 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 回答