【问题标题】:Comparing two JSON files using java使用java比较两个JSON文件
【发布时间】: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() 方法!

标签: java json pojo


【解决方案1】:

您正在尝试读取 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>(){});

【讨论】:

    【解决方案2】:

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

    因为你使用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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多