首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当比较对象数组和忽略该数组中的字段时,将忽略JSONCompareMode.NON_EXTENSIBLE。

当比较对象数组和忽略该数组中的字段时,将忽略JSONCompareMode.NON_EXTENSIBLE。
EN

Stack Overflow用户
提问于 2022-10-12 12:57:53
回答 1查看 51关注 0票数 0

我使用JSONAssert 1.5.0来比较Jsons。我有一个自定义比较器来忽略ID字段,这将因发情期不同而有所不同。JSON会像这样

代码语言:javascript
复制
{
  "id": 34,
  "fieldxy": abc
  "status": [
    {
      "id": 69,
      "code": 9250,
    },
    {
      "id": 68,
      "code": 9251,
    }
  ]
}

这个比较器看起来如下:

代码语言:javascript
复制
private final JSONComparator myComparator = new CustomComparator(
        JSONCompareMode.NON_EXTENSIBLE,
        new Customization("id",(o1, o2) -> true),
        new Customization("status",
                new ArrayValueMatcher<>(
                        new CustomComparator(JSONCompareMode.NON_EXTENSIBLE,
                            new Customization("status[*].id", (o1, o2) -> true))))
        );

我今天添加了第二个定制,以忽略数组中的字段,如这里所建议的:Ignore specific node within array when comparing two JSON in Java注释:如果没有ArrayValueMatcher,它就不能工作。

忽略这两个id字段,基本字段"id“和状态数组"status.id”中的“id”,现在工作正常。

然而。现在,数组对象的排序突然变得重要-- status对象具有随机排序,现在我的比较失败了,如果"status.code“不在正确的位置,即使使用NON_EXTENSIBLE作为JSONCompareMode。在添加第二个定制和小心之前,status.id总是具有真正的价值,忽略数组排序确实有效。

你知道为什么这不管用吗?现在是否需要为所有数组字段添加自定义?我毫无头绪

编辑:尝试一种不同的方法,也不起作用:

代码语言:javascript
复制
private final JSONComparator myComparator = new CustomComparator(JSONCompareMode.NON_EXTENSIBLE,
new Customization("**.id",(o1, o2) -> true));

works:

  • (status.id = 69;status.code = 9250 // status.id = 68;status.code = 9251):PASS

  • 但使用这两种方法时,does work:

  • (status.id = 68;status.code = 9250 / status.id = 68;status.code = 9251):PASS

  • (status.id = 69;status.id = 9250 // = 69;anything:

  • (status.id =9251( status.code = 9251):PASS

  • ,但不是

= 68;status.code = 9250 // status.id = 69;status.code = 9251):失败

  • 或status.code = 123;status.code = 9250 / status.id = 456;status.code= 9251):FAIL
EN

回答 1

Stack Overflow用户

发布于 2022-12-02 09:39:41

试试这个:

代码语言:javascript
复制
new CustomComparator(
    JSONCompareMode.NON_EXTENSIBLE,
    new Customization("id",(o1, o2) -> true),
    new Customization("status[*].id", (o1, o2) -> true));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74042221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档