【发布时间】:2022-01-09 14:35:37
【问题描述】:
我有两个 JSON 文件,分别称为“pickevent1”和“pickevent2”。我必须比较两个文件是否匹配;如果它们不匹配,我需要知道它们不匹配的地方。
pickevent1
{
"pickEventActivities": [{
"orderId": "215",
"lineNbr": 0,
"pick": "EACH",
"activations": [{
"activationType": "Si",
"activationValue": "31"
}]
}]
}
pickevent2
{
"pickEventActivities": [{
"orderId": "115",
"lineNbr": 1,
"pick": "Hello",
"activations": [{
"activationType": "Bi",
"activationValue": "3"
}]
}]
}
我创建了一个pick事件POJO类:
@JsonRootName(value = "pickEventActivities")
@Data
@JsonPropertyOrder({ "orderId", "lineNbr", "pick"})
class PickEvent {
String orderId;
String lineNbr;
String pick;
List<Activation> activations;
}
还有一个 Activation 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) 时,它给了我 null 的 json 值:
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)
它应该给我一个断言错误,但测试成功。
【问题讨论】:
-
您是否为 POJO 覆盖了
equals()和hashCode()? -
@LHCHIN 不,我没有
-
您必须覆盖
equals()(例如由您的 IDE 生成),以便您可以根据内部详细信息比较两个 PickEvent。请参考Compare two objects with .equals() and == operator。 -
@LHCHIN – 你说得对,需要
equals()来根据内部细节进行比较。但是当方法没有被覆盖时,两个不同对象的assertEquals()应该总是失败。为什么这里没有失败?? -
我不明白为什么您的测试没有失败,但请注意 Lomboks
@Data注释已经提供了equals()和hashCode()方法!