2016-07-14 68 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