【问题标题】:Deserialize only 1 JSON object from JSON array仅从 JSON 数组反序列化 1 个 JSON 对象
【发布时间】:2022-01-07 11:06:16
【问题描述】:

我正在尝试反序列化以下 json,并希望在结果中仅包含必要的字段。
是否可以使用 gson 或其他方式从 commonfeed 数组中仅提取 "DD" 字段?或许用其他机制替换@SerializedName("DD")

String json = "{\"common_feed\": [{\"DA\": 1}, {\"DZ\": 1}, {\"DB\": 1}, {\"DD\": 1641585600}, {\"DM\": \"\"}, {\"POS\": false}, {\"DX\": \"OD,HH,SCR,LT,TA,TV\"}, {\"DT\": false}], \"final_stage\": \"\", \"participantsData\": {\"home\": [{\"id\": \"YeGlkuUb\", \"name\": \"Mlada Boleslav\"}], \"away\": [{\"id\": \"rgfiJkOs\", \"name\": \"Litvinov\"}], \"is_national\": false}}";
            final Result result = new GsonBuilder()
                    .serializeNulls()
                    .create()
                    .fromJson(json, Result.class);
System.out.println(result);


    class Result {
        ParticipantsData participantsData;
        @SerializedName("common_feed")
        List<CommonFeed> commonFeed;

        @Override
        public String toString() {
            return "Result{" +
                    "participantsData=" + participantsData +
                    ", commonFeed=" + commonFeed +
                    '}';
        }
    }

    class ParticipantsData {
        List<Team> home;
        List<Team> away;

        @Override
        public String toString() {
            return "ParticipantsData{" +
                    "home=" + home +
                    ", away=" + away +
                    '}';
        }
    }

    class Team {
        String name;

        @Override
        public String toString() {
            return "Team{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }

    class CommonFeed {
        @SerializedName("DD")
        int date;

        public CommonFeed(int date) {
            this.date = date;
        }

        @Override
        public String toString() {
            return "CommonFeed{" +
                    "date=" + date +
                    '}';
        }
    }

输出:

Result{participantsData=ParticipantsData{home=[Team{name='Mlada Boleslav'}], away=[Team{name='Litvinov'}]}, commonFeed=[CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=1641585600}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}]}

想要的输出:

Result{participantsData=ParticipantsData{home=[Team{name='Mlada Boleslav'}], away=[Team{name='Litvinov'}]}, commonFeed=[CommonFeed{date=1641585600}]}

【问题讨论】:

  • 据我了解,您可能会看到这样的内容:stackoverflow.com/a/27424214/10832295
  • 不可能,因为 Gson 会反序列化它所能做的一切。首先反序列化列表,然后使用DD 映射不为空的谓词对其进行过滤。如果它占用太多内存,请实现您自己的流阅读器,只提取您需要的内容。无论如何,它看起来像是一个糟糕的设计。
  • 感谢您的两个建议。 @fluffy - 但是,我已经实现了你的。

标签: java json gson


【解决方案1】:

没有什么比好的设计更重要的了。但是如果真的有必要,除了评论之外,您还可以在使用您自己的类型反序列化时欺骗 GSON。因此,例如创建类:

@SuppressWarnings("serial")
public class CommonFeedList extends ArrayList<CommonFeed> {
    @Override
    public boolean add(CommonFeed commonFeed) {
        if(commonFeed.getDate() == 0) {
            return false;
        }
        return super.add(commonFeed);
    }
} 

并对您的 Response 类稍作修改:

class Result {        
    @SerializedName("common_feed")
    CommonFeedList commonFeed;
    ...
}

当然,改变列表类型也可以防止序列化CommonFeed 的“DD 类型”。在这种情况下,您需要另一种类型来序列化所有类型。

反正这种东西不能随便用。始终先检查更改设计的可能性。

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多