放心 - 比较两个 JSON 对象
REST assured - compare two JSON objects
假设 GET 请求 returns 我有一些 JSON 对象:
{
"a": 1, "b": 2, "c": 3, "date": "current_date"
}
我手上有一个类似的对象,我想检查它与键“a”、“b”、“c”是否相同,并忽略“日期”键。
我该怎么做?
您可以将其转换为 Json 对象并删除不需要的密钥。详情请关注link:
我发现 rest-assured 有一些有趣的功能。
你可以这样做:
@Test
public void test() {
get("/xxxx").then().statusCode(200).assertThat()
.body("a", equalTo(1));
}
更多信息here
您可以将 JSON 转换为 JS 对象,然后比较该对象的每个 属性 如果 属性 的键不等于“日期”
在下面的代码中比较 obj1
和 obj2
并忽略 date
属性。
如果它们相同则打印“相同”,如果不相同则打印“不相同”(忽略 date
属性)
var obj1 = JSON.parse ('{ "a":"1","b":"2", "c":"3", "date":"current_date"}' );
var obj2 = JSON.parse ('{ "a":"1","b":"2", "c":"3", "date":"another_date"}' );
let s1 = Object.keys(obj1).length; // length of obj1
let s2 = Object.keys(obj2).length; // length of obj2
let identical = true ;
for ( let i = 0 ; i < s1 ; i ++ ){
if (i >= s2) {
identical = false ;
break ;
}
let current_key = Object.keys(obj1)[i];
let current_value = obj1[current_key];
if (current_key.localeCompare("date") != 0){
if (current_value.localeCompare(obj2[current_key]) != 0){
identical = false ;
break;
}
}
}
if (identical){
console.log ("Identical");
}else {
console.log ("Not identical");
}
我一直在使用 JsonUnit 它真的很有帮助
String json1 = "{\r\n" + " \"a\": 1,\r\n" + " \"b\": 2,\r\n" + " \"c\": 3,\r\n"
+ " \"date\": \"30-07-2020\"\r\n" + "}";
String json2 = "{\r\n" + " \"a\": 1,\r\n" + " \"b\": 2,\r\n" + " \"c\": 3,\r\n"
+ " \"date\": \"31-07-2020\"\r\n" + "}";
assertThatJson(json1).whenIgnoringPaths("date").isEqualTo(json2);
静态导入:
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
依赖关系:
<dependency>
<groupId>net.javacrumbs.json-unit</groupId>
<artifactId>json-unit-assertj</artifactId>
<version>2.18.1</version>
<scope>test</scope>
</dependency>
您还必须将 json.org
或 Jackson 1.x
或 Jackson 2.x
或 Johnzon
或 Gson
添加到类路径中
我用Jackson
- 使用AssertJ ignoring fields in the comparison
因为需要将 json 从响应(对于 Spring 测试:MvcResult.getResponse().getContentAsString()
)反序列化为对象。
可以使用 REST Assured Content-Type based Deserialization 反序列化 json 响应
- 使用不严格与 JSONassert 进行比较。
为了不手动创建 json,可以使用 Jackson ObjectMapper
序列化预期的对象。对于字段排除:
Map<String, Object> map = objectMapper.convertValue(obj, new TypeReference<Map<String, Object>>() {});
map.remove(...);
objectMapper.writeValueAsString(obj)
假设 GET 请求 returns 我有一些 JSON 对象:
{
"a": 1, "b": 2, "c": 3, "date": "current_date"
}
我手上有一个类似的对象,我想检查它与键“a”、“b”、“c”是否相同,并忽略“日期”键。
我该怎么做?
您可以将其转换为 Json 对象并删除不需要的密钥。详情请关注link:
我发现 rest-assured 有一些有趣的功能。
你可以这样做:
@Test
public void test() {
get("/xxxx").then().statusCode(200).assertThat()
.body("a", equalTo(1));
}
更多信息here
您可以将 JSON 转换为 JS 对象,然后比较该对象的每个 属性 如果 属性 的键不等于“日期”
在下面的代码中比较 obj1
和 obj2
并忽略 date
属性。
如果它们相同则打印“相同”,如果不相同则打印“不相同”(忽略 date
属性)
var obj1 = JSON.parse ('{ "a":"1","b":"2", "c":"3", "date":"current_date"}' );
var obj2 = JSON.parse ('{ "a":"1","b":"2", "c":"3", "date":"another_date"}' );
let s1 = Object.keys(obj1).length; // length of obj1
let s2 = Object.keys(obj2).length; // length of obj2
let identical = true ;
for ( let i = 0 ; i < s1 ; i ++ ){
if (i >= s2) {
identical = false ;
break ;
}
let current_key = Object.keys(obj1)[i];
let current_value = obj1[current_key];
if (current_key.localeCompare("date") != 0){
if (current_value.localeCompare(obj2[current_key]) != 0){
identical = false ;
break;
}
}
}
if (identical){
console.log ("Identical");
}else {
console.log ("Not identical");
}
我一直在使用 JsonUnit 它真的很有帮助
String json1 = "{\r\n" + " \"a\": 1,\r\n" + " \"b\": 2,\r\n" + " \"c\": 3,\r\n"
+ " \"date\": \"30-07-2020\"\r\n" + "}";
String json2 = "{\r\n" + " \"a\": 1,\r\n" + " \"b\": 2,\r\n" + " \"c\": 3,\r\n"
+ " \"date\": \"31-07-2020\"\r\n" + "}";
assertThatJson(json1).whenIgnoringPaths("date").isEqualTo(json2);
静态导入:
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
依赖关系:
<dependency>
<groupId>net.javacrumbs.json-unit</groupId>
<artifactId>json-unit-assertj</artifactId>
<version>2.18.1</version>
<scope>test</scope>
</dependency>
您还必须将 json.org
或 Jackson 1.x
或 Jackson 2.x
或 Johnzon
或 Gson
添加到类路径中
我用Jackson
- 使用AssertJ ignoring fields in the comparison
因为需要将 json 从响应(对于 Spring 测试:MvcResult.getResponse().getContentAsString()
)反序列化为对象。 可以使用 REST Assured Content-Type based Deserialization 反序列化 json 响应
- 使用不严格与 JSONassert 进行比较。
为了不手动创建 json,可以使用 JacksonObjectMapper
序列化预期的对象。对于字段排除:
Map<String, Object> map = objectMapper.convertValue(obj, new TypeReference<Map<String, Object>>() {});
map.remove(...);
objectMapper.writeValueAsString(obj)