2012-08-30 27 views
3

我正在使用Gson類將JSON字符串數據轉換爲Intent對象。但我得到例外。意向將意圖的JSON字符串轉換爲意圖對象的例外

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 

感謝您的幫助。

+1

的「JSON字符串」是一個爛攤子,不是一個有效的JSON字符串... – Xaerxess

+0

對不起我的錯誤錯字:(現在編輯 –

+0

儘管如此,'{「權威」: 「decode」:「com.android.contacts」,「encoded」'不是有效的JSON片段,JSON對象也應該以'{'開始。將JSON字符串粘貼到[this validator]中(http://jsonformatter.curiousconcept你可以看到你有錯誤 – Xaerxess

回答

1

我的投注是Intent#uriString是類型android.net.Uri,它沒有無參數的公共構造函數。我是指你必須寫JsonDeserializer<Uri>這樣的:通過GsonBuilder

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

,然後註冊它:

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

編輯:

你的情況下,註冊自定義適配器的任何屬性不定義公共無參數構造函數。您可以在Gson docs - Custom Serialization and Deserialization中閱讀更多內容。

+0

您能否詳細說明爲什麼我們要這樣做?我認爲它的工作,但讓我檢查完全然後我會接受它:) –

+0

但它從對象再次轉換爲json字符串後省略了大量的數據我收到類似於: {「targetIntent」:{ 「mAction」: 「android.intent.action。VIEW」, 「MDATA」:{ }, 「mFlags」:0 }} –

+0

「從對象到JSON字符串」 是另一種方式('gson.toJson(意向)') - 你問'GSON .fromJson(String)'在這裏,這不是同一個問題。 – Xaerxess

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,並使用android URI類的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); 
+0

是的,我用串行器和解串器的相同。但我必須接受上面的答案,因爲他先回答了,但也感謝你的努力,謝謝! –