Comparing two JSON files using java



我有两个JSON文件,称为"pickeevent1";以及";pickeevent2";。我必须比较两个文件是否匹配;如果他们不匹配,我需要知道他们在哪里不匹配。

pickeevent1

{
"pickEventActivities": [{
"orderId": "215",
"lineNbr": 0,
"pick": "EACH",
"activations": [{
"activationType": "Si",
"activationValue": "31"
}]
}]
}

pickeevent2

{
"pickEventActivities": [{
"orderId": "115",
"lineNbr": 1,
"pick": "Hello",
"activations": [{
"activationType": "Bi",
"activationValue": "3"
}]
}]
}

我创建了一个选择事件POJO类:

@JsonRootName(value = "pickEventActivities")
@Data
@JsonPropertyOrder({ "orderId", "lineNbr", "pick"})
class PickEvent {
String orderId;
String lineNbr;
String pick;
List<Activation> activations;
}

和激活POJO类:

@Data
@JsonPropertyOrder({ "activationType", "activationValue"})
public class Activation {
String activationType;
String activationValue;
}

为了确保它有效,我创建了一个测试类:

public void compareJson() throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

PickEvent result1 = objectMapper.readValue(new File("src/../pickevent1.json"), PickEvent.class);
PickEvent result2 = objectMapper.readValue(new File("src/../pickevent2.json"), PickEvent.class);

assertEquals(result1, result2);
}

但当我执行assertSame(result1,result2)时,它会为json值提供null:

Exception in thread "main" java.lang.AssertionError: expected same:<PickEvent(orderId=null, lineNbr=null, pick=null, activations=null)> was not:<PickEvent(orderId=null, lineNbr=null, pick=null, activations=null)>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotSame(Assert.java:828)
at org.junit.Assert.assertSame(Assert.java:771)
at org.junit.Assert.assertSame(Assert.java:782)
at JsonDiff.PickEventDiff.comparejson(PickEventDiff.java:26)
at JsonDiff.PickEventDiff.main(PickEventDiff.java:32)

它应该会给我一个断言错误,但测试成功了。

它应该会给我一个断言错误,但测试成功了。

因为您使用objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);。事实上,在解析过程中发生了异常。

尝试:

public void compareJson() throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
Wrapper wrapper = objectMapper.readValue(new File(""), Wrapper.class);
Wrapper wrapper2 = objectMapper.readValue(new File(""), Wrapper.class);
System.out.println(wrapper.equals(wrapper2));
}
@Data
static class Wrapper {
List<PickEvent> pickEventActivities;
}

您试图读取一个PickEvent对象,但实际上在那里发送了一个列表。

请将您的json更改为

{
"pickEventActivities": {
"orderId": "115",
"lineNbr": 1,
"pick": "Hello",
"activations": [{
"activationType": "Bi",
"activationValue": "3"
}]
}
}

或者尝试将代码更改为

List<PickEvent> list1 = objectMapper.readValue(new File("src/../pickevent1.json"), new ParameterizedTypeReference<PickEvent>(){});

这是我的Intellij Idea插件的github repo。基本上是用java实现的JSON比较器。它通过数组中的字段、值和对象来比较JSON

最新更新