Java如何比较元素实际类型不同的List<Group>集合(Okta SDK场景)
方案1:直接对比JSON结构(无需处理类型转换,实现最简单)
你不需要强制把入参payload转成Group实例,只要把两边的数据都转成Jackson的JsonNode直接对比内容即可:
// 入参JSON直接读为JsonNode JsonNode payloadNode = mapper.readTree(body); // Okta返回的Group列表转成JsonNode JsonNode oktaNode = mapper.valueToTree(groupListOkta); // 全量对比内容是否一致,也可以按元素遍历判断增删改 boolean contentEqual = payloadNode.equals(oktaNode);
如果需要确定每个对象对应的HTTP操作,遍历两个JsonNode数组,按id字段匹配后对比单个元素内容即可。
方案2:正确反序列化得到Group实例
反序列化得到LinkedHashMap的核心原因是普通Jackson实例没有Okta SDK的类型映射信息,不知道Group接口对应的实现类,也没有适配SDK的序列化规则,按以下方式调整即可:
- 优先使用Okta SDK内置的已配置好的ObjectMapper:
// 从Okta客户端实例获取内置Mapper ObjectMapper oktaMapper = okta.getClient().getObjectMapper(); // 用TypeReference避免泛型类型擦除,指定实现类 List<Group> groupListBody = oktaMapper.readValue(body, new TypeReference<List<DefaultGroup>>() {});
- 如果你必须使用自己初始化的Mapper,手动添加SDK的类型配置即可:
// 注册Okta SDK序列化模块,绑定接口到实现类 mapper.registerModule(new OktaSdkModule()); mapper.addAbstractTypeMapping(Group.class, DefaultGroup.class); // 正常反序列化即可得到Group实例列表 List<Group> groupListBody = mapper.readValue(body, new TypeReference<List<Group>>() {});
反序列化完成后就可以直接调用Group接口的getId()、getProfile()等方法,逐字段对比两个列表的元素内容。
内容的提问来源于stack exchange,提问作者JeremP
相关产品推荐
相关产品推荐

