gpt4 book ai didi

java - 将 JSON 对象与实例匹配

转载 作者:搜寻专家 更新时间:2023-11-01 02:42:35 25 4
gpt4 key购买 nike

假设我有以下 DTO:

class C {
String a;
String b;
}

我有 JSON:

{
"c" : {
"a" : "aaa",
"b" : "bbb"
}
}

我想做的是,完成以下测试:

C expected = new C("aaa","bbb");
mockMvc.perform(get("url"))
.andExpect(jsonPath("$.c", is(expected)));

它失败了。如果我首先将 expected 序列化为 JSON 然后尝试匹配,它再次失败,因为它是一个字符串。这可能吗?

最佳答案

永远记住:没有“JSON 对象”这样的东西。 JSON 是对象的序列化格式。 JSON 始终是一个字符串。您可以从对象转换为 JSON 并返回(因此从对象转换为字符串并返回)。但是

{ "a": "b" }

是一个 JavaScript 对象,而不是 JSON(即使它看起来非常相似)。

这实际上就是您问题的答案:当您序列化 expected 时,您会得到 JSON(传输格式,即字符串)。这不是 jsonPath() 检查的内容。 jsonPath() 针对 JavaScript 类型进行验证。

This blog post建议您需要单独检查每个字段:

.andExpect(jsonPath("$.c.a", is(expected.a)))
.andExpect(jsonPath("$.c.b", is(expected.b)));

这很乏味。你需要的是

a) 配置您的 JSON 框架以使用对键进行排序的映射系统

b) 您需要弄清楚 jsonPath("$.c", ...) 返回什么类型 - 它可能是您的 JSON 框架用来表示通用 JavaScript 对象的类型。

支票看起来像这样:

C c = new C("aaa","bbb");
String serialized = JSON.serialize(c); // to string
JSObject expected = JSON.parse(serialized); // to generic JavaScript object
mockMvc.perform(get("url"))
.andExpect(jsonPath("$.c", is(expected)));

请注意,这仅在 JSObject 具有适当的 equals() 实现时才有效。

关于java - 将 JSON 对象与实例匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com