当前位置: 首页 > 知识库问答 >
问题:

如何删除json键值与java中的JSonPath

尚宏硕
2023-03-14

我知道这可能是一个重复,但仍然张贴我的问题,因为我找不到确切的答案我在寻找什么。我有一个json对象(或字符串)如下。

String str = "{
    "status" : {
        "timestamp" : "2020-04-30T01:00:00 000Z"
        "error" : 0,
        "error_message" : null,
        "execution" : "completed"
    }
}
";

我将从RESTAPI测试中得到相同类型的响应,但是在每次调用之后,“timestamp”键将具有一个动态日期和时间值,该值与调用的时间有关。在这里,我使用JSONAssert将我的expect json与实际json作为一个整体进行比较。因为时间戳值不同,所以对我来说总是失败。

所以我的问题是,在我做任何比较之前,我想从json中删除时间戳键及其值进行比较,这样它就会通过我的案例。我尝试使用JsonPath也,但不工作。有什么可以帮忙的吗?

共有1个答案

宋成天
2023-03-14

JSONAssert允许您在执行断言[1]时创建自定义的比较器。

在您的情况下,很容易做到:

JSONAssert.assertEquals(expectedJson,
                        actualJson,
                        new CustomComparator(JSONCompareMode.LENIENT,
                                            skips("status.timestamp","another.json.path", ...)));

private static Customization[] skips(String... jsonPaths) {
    return Arrays.stream(jsonPaths)
                 .map(jsonPath -> Customization.customization(jsonPath, (o1, o2) -> true))
                 .toArray(Customization[]::new);
}

这里我们定义了CustomComparator,带有customization,它采用JSONPath(status.timestamp)并采用一个ValueMatcher(lambda)来比较特定JSONPath的两个值。

在我们的例子中,我们总是返回true,这将有效地跳过该值(无论我们将该值与什么进行比较,它总是true)。

编辑:正如您所看到的那样,CustomComparator的构造函数接受Customizations的varargs,因此您可以提供多个字段以在比较中忽略。

[1] http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/Customization.html

[2] http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/comparator/CustomComparator.html

 类似资料:
  • 问题内容: 我有一个像这样的json字符串: 我想将上述字符串转换为JSONObject,以便可以执行以下操作: 这样我就可以轻松打印出以下内容的json字符串: 对我来说最简单的方法是什么? 问题答案: org-json-java可以做你想要的事情 执行结果是 在运行上述代码之前,请确保已从此处下载并导入了org.json-YYYYMMDD.jar 。

  • 通过特定的标签/键从整个JSON中删除任意值的简单方法是什么?我的JSON可能具有任意深度,因此按标签删除应该递归完成。 并且我想删除所有带有标签的元素,以便最终结果如下所示: 使用/会产生意想不到的结果(尤其是当有嵌套对象要删除时),因此它必须是一个支持JSON的实用工具,如jq或类似工具。

  • 注意:我没有看到我的原始JSON,也不知道包装器元素是谁或什么。

  • 我试图递归删除JSON对象和所有子对象中的空值。如果子对象的关键点都已删除,则我希望该子对象也被删除。 比如。 应该变成这样: 下面是我编写的删除所有空值键的函数: 但这不会删除没有子项的父项: 因此,我得到的不是上面的结果,而是: 如您所见,它不会删除申请人的密钥。我如何在函数中检查它?或者它是否需要编写在我调用delKeys()后调用的单独函数中? 还有,有人看到这达到了最大递归深度吗?我尝试

  • 只有当每个键在map1中都有唯一的值时,我才会陷入如何将键值对从map1转移到map2的困境。 假设我有以下地图: 地图1:[1,2][2,4][4,4] 我想算法应该是: 遍历第一张地图中的条目。 向map2添加密钥。 将一个值添加到检查map2的值的集合 如果值是重复的,则不会将该值添加到集合中,并且忽略将其相应的键添加到map2。 代码片段: 我的想法是如何在正确的轨道上完成的吗?这里迷失了

  • 这真的只是我的问题。我在网上所能找到的只是如何删除键值对,而不是如何在键值是列表的情况下从键值中删除特定值。例:一个关键的情感值是[‘中立’、‘快乐’],我只想删除‘快乐’。字典[情感]。删除('happy')根本不起作用。