2016-07-14 67 views
0

是有沒有這個JSON轉換任何簡單的方法:JSON解析一個字符串到對象

{ 
    ..., 
    "pictures": [ 
     "url1", 
     "url2" 
    ], 
    ... 
} 

List<Picture> pictures 

其中圖片:

class Picture{ 
     String url; 
} 

它不會像上面那樣工作,因爲我有個例外,說

Expected BEGIN_OBJECT but was STRING 
+0

根據您對該對象的使用情況,快速修復可能會將'@ JsonValue'放在您的'String url'的getter上方。 – Zircon

+0

@Zircon錯誤的庫。另外,這隻會對序列化有用。 –

回答

1

您需要爲此實現自定義解串器。 應該尋找這樣的(我沒有嘗試執行,但應該給你知道從哪裏開始,想必你有String參數的公共構造在Picture.class

private class PictureDeserializer implements JsonDeserializer<Picture> { 
    public Picture deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 
    return new Picture(json.getAsJsonPrimitive().getAsString()); 
    } 
} 

應當登記:

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(Picture.class, new PictureDeserializer()); 
+0

我知道反序列化方法來做這件事情,有沒有其他方法可以避免使反序列化? – PaleNisko

+1

@PaleNisko那麼你應該在問題中提到它,以避免讓人們腰纏萬貫。無論如何,答案是:我不這麼認爲。映射程序包含一對預定義的操作,它們以一對一關係(簡化)爲基礎映射到最通用的類​​型/類。通過JSON樹,映射器遇到不同的類型/類並相應地反序列化它們。例如。單個字符串被映射到String.class開箱即用。如果你有一個自定義的Picture.class,那麼Mapper就不能擁有一致的映射,因爲它的開發人員無法記住世界上所有的類。 –

+0

好的,謝謝你的反饋,我會記住你的建議。知道我明白爲什麼這樣做了! – PaleNisko