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

JSONPath表达式的匹配器以查找字段顺序

公羊瀚
2023-03-14

我有一个API,它返回一个将在UI中显示的JSON对象。对象中字段的顺序很重要,因为UI希望按该顺序显示字段。我想编写一个单元测试来确保对象中字段的顺序是正确的。我的API响应如下所示:

{
    "data": {
        "field1": "value1",
        "field2": "value2"
     }
}

使用spring boot的< code>MockMvc库,我想编写一个这样的表达式来验证字段是否按顺序返回:

.andExpect(jsonPath("$.data"), is("field1=value1, field2=value2")

显然,上述方法不起作用,但我不确定我应该使用哪种类型的Matcher来尝试并验证字段是否正确。

共有1个答案

卜瀚漠
2023-03-14

我找不到比较字段顺序的Hamcrest匹配器,但编写自己的很容易。请注意,JSON路径表达式的结果将为您提供一个LinkedHashMap,因此您所需要的只是一个Matcher,它接受一个LinkedHashMap并将其与给定对象进行比较,按条目的顺序逐个条目。将映射转换为条目的List并使用Listequals方法可以解决问题,因为List会按顺序比较项目。

这是匹配器的样子:

private class OrderedMapMatcher extends BaseMatcher<Map<String, String>> {

    private LinkedHashMap<String, String> expected;

    public OrderedMapMatcher(LinkedHashMap<String, String> expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object o) {
        if (!(o instanceof LinkedHashMap)) {
            return false;
        }
        LinkedHashMap actual = (LinkedHashMap) o;
        List<Map.Entry<String, String>> expectedList = new ArrayList<>(expected.entrySet());
        List actualList = new ArrayList(actual.entrySet());
        return expectedList.equals(actualList);
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(expected.toString());
    }
}

断言是这样的:

LinkedHashMap<String, String> expectedData = new LinkedHashMap<>();
expectedData.put("field1", "value1");
expectedData.put("field2", "value2");

// mockMvc ResultActions code would be here
.andExpect(jsonPath("$.data", new OrderedMapMatcher(expectedData)));
 类似资料:
  • 问题内容: 我是正则表达式新手,但我了解如何按顺序匹配正则表达式查询中的任何字符(例如[abc]将匹配a,b或c中的任何一个。此外,我相信“ abc”将完全匹配abc)。 但是,我该如何构造一个以任何顺序匹配所有字符abc的正则表达式查询?因此,例如,我希望它匹配“ cab”或“ bracket”。我使用Python作为脚本语言(不确定是否重要)。 问题答案: 在Python中,我不会为此目的使用

  • 问题内容: 我试图返回一个数组或切片,针对字符串针对特定正则表达式的所有匹配项。字符串是: 我想返回一个花括号之间所有字符串都匹配的数组。我尝试使用regexp软件包来完成此操作,但无法弄清楚如何返回我要查找的内容。这是我当前的代码: 但是,无论我尝试什么,每次返回的结果都是一片空白。 问题答案: 首先,您不需要正则表达式定界符。其次,使用原始字符串文字定义一个正则表达式模式是个好主意,您只需要使

  • 问题内容: 我正在尝试创建一个匹配字符串的正则表达式,如果它连续有3个或多个重复字符(例如aaaaaa,testtttttt,otttttter)。 我尝试了以下方法: 连续 匹配 任意 3个字符,但不 连续的 字符…我在哪里出错? 问题答案: 您要的内容无法使用 真正的 正则表达式完成,您需要的是(不规则的)反向引用。尽管许多正则表达式引擎实现了它们,但Go使用的RE2却没有。RE2是一种快速的

  • 问题内容: 什么正则表达式将匹配Java中的任何ASCII字符? 我已经尝试过: 但是发现它与我想要的很多东西都不匹配(例如空格,括号等)。我希望避免以如下格式显式列出所有127个ASCII字符: 问题答案: 我没用过但是我用过

  • 问题内容: 有没有一种方法可以使我按照WHERE命令中要求的顺序使mysql从成员数据库返回结果? 目前,无论我做什么,它将返回MemberID ASC排序的结果。我希望它能按我要求的顺序返回6,3,5。 问题答案:

  • 如何使用regex匹配任何单词而不显示指定的单词 我想去掉“你”这个词 我有一些词例如: 所以,这个项目的结果是: