我正在尝试找出一种方法来选择性地反序列化 flickr 中的特定字段。
{"photos":{"page":1,"pages":10,"perpage":100,"total":1000,"photo":[{"id":"","owner":"","secret":"","server":"","farm":,"title":"","ispublic":,"isfriend":,"isfamily":0,"url_s":"","height_s":"","width_s":""},...]}
我收到一个包含两个列表(照片和照片)的对象,我想在 Java 中仅对照片中的 id、url_s 和标题进行建模。
我发现我可以使用 @expose 注释为我感兴趣的字段创建我的 java 模块,而不是使用 builder.excludeFieldsWithoutExposeAnnotation(); 这样我就可以控制从照片中反序列化哪些字段(仍然不确定它是否能以这种方式工作),但是照片呢?
我的问题是:
有办法忽略该列表吗?我是否必须对包含两个列表(及其各自的字段)的 Java 类进行建模才能从第二个列表中获取我需要的内容?
扩展前一个问题,如果我的照片模块类是:
public class GalleryItem { @Expose() private String mCaption; @Expose() private String mId; @Expose() private String mUrl; }
我可以只在我需要的部分调用gson吗?
Type galleryListType = new TypeToken<ArrayList<GalleryItems>> (){}.getType(); List<GalleryItems> itemsList = gson.fromJson(jsonString, galleryListType);
我可以使用 setExclusionStrategies 跳过照片列表吗?
gsonBuilder.setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { **return f.getName().contains("photos")**; } @Override public boolean shouldSkipClass(Class<?> incomingClass) { return ; } });
我已经使用原始 JSONObject/JSONArray 实现了一个解决方案,但我很好奇使用 GSON 来完成手头的任务。
提前致谢!
最佳答案
Gson 提供 Java 字段的反序列化。如果您标记为transient
你的变量,Gson 不会序列化为 JSON。 Gson 还通过注释提供更精细的反序列化控制:@Expose(deserialize = false/true)
最后一个选项是编写您的自定义 JsonDeserializer<T>
关于Java Gson 从对象内的列表中反序列化选定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44134860/