Java Gson从对象内的列表中反选所选字段的反序列化

时间:2017-05-23 12:29:02

标签: java gson flickr android

我试图找出一种从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和title来建模。

我发现我可以使用@expose注释为我感兴趣的字段创建我的java模块而不是使用         builder.excludeFieldsWithoutExposeAnnotation(); 通过这种方式,我可以控制哪些字段从照片中反序列化(仍然不确定它的gonne是如何工作的),但照片呢?

我的问题是:

  1. 有没有办法忽略该列表?我是否必须为包含两个列表(及其各自的字段)的Java类建模,以便从第二个列表中获取我需要的内容?

  2. 扩展前一个问题,如果我的照片模块类是:

    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);  
    
  3. 我可以以某种方式使用setExclusionStrategies跳过照片列表吗?

    gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {  
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        **return f.getName().contains("photos")**;
    }
    
    @Override
    public boolean shouldSkipClass(Class<?> incomingClass) {
        return ;
    }
    }); 
    
  4. 我已经使用原始JSONObject / JSONArray实现了解决方案,但我对使用GSON执行手头的任务感到好奇。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

Gson提供Java字段的反序列化。如果您将变量标记为transient,Gson将不会序列化为JSON。 Gson还通过注释提供更精细的反序列化控制:@Expose(deserialize = false/true) 最后一个选项是编写自定义JsonDeserializer<T>