【问题标题】:Java Gson Deserialization of selected fields from a list inside an objectJava Gson 对象内列表中选定字段的反序列化
【发布时间】:2017-05-23 12:29:02
【问题描述】:

我正在尝试找出一种方法来选择性地反序列化来自 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(); 通过这种方式,我将控制哪些字段从照片中反序列化(仍然不确定它是否可以这样工作),但是照片呢?

我的问题是:

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

我已经使用原始 JSONObject/JSONArray 实现了一个解决方案,但我对使用 GSON 来完成手头的任务感到好奇。

提前致谢!

【问题讨论】:

    标签: java gson flickr android


    【解决方案1】:

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

    【讨论】:

    • 我知道你可以使用@Expose(正如我上面写的那样)并且瞬态不会帮助我,因为我试图有选择地反序列化,而不是序列化除了瞬态变量之外的所有内容
    猜你喜欢
    • 2021-12-08
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多