杰克逊前

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

在本文中,我们将看看比较两个JSON对象的使用杰克逊—一个用于Java的JSON处理库。

2.Maven的依赖

首先,我们加入jackson-databindMaven依赖性:

<依赖> < groupId > com.fasterxml.jackson。jackson-databind 2.11.1 

3.使用杰克逊比较两个JSON对象

我们将使用objectmap类将对象读取为JsonNode。

让我们创造一个objectmap:

objectMapper映射器= new objectMapper();

3.1。比较两个简单的JSON对象

让我们首先使用JsonNode.equals方法。equals ()方法执行完整(深度)比较。

假设我们有一个json字符串定义为s1变量:

{"员工":{" id ": " 1212 "、“fullName”:“约翰英里”,“年龄”:34}}

我们想把它和另一个JSON进行比较,s2:

{"员工":{" id ": " 1212 ",“年龄”:34岁“fullName”:"约翰英里"}}

让我们将输入的JSON读取为JsonNode和比较:

assertequal (mapper.readTree (s1), mapper.readTree (s2));

值得注意的是即使输入JSON变量中的属性顺序s1s2不一样,是吗equals ()方法忽略顺序并将它们视为相等的。

3.2。将两个JSON对象与嵌套元素进行比较

接下来,我们会看到如何比较两个具有嵌套元素的JSON对象。

让我们从一个定义的JSON开始s1变量:

{"员工":{" id ": " 1212 "、“fullName”:“约翰英里”,“年龄”:34岁“接触”:{“电子邮件”:“[电子邮件受保护]“,”电话“:”9999999999“}}}

如我们所见,JSON包含一个嵌套的元素联系。我们想要将它与另一个JSON进行比较s2:

{"员工":{" id ": " 1212 ",“年龄”:34岁“fullName”:“约翰英里”,“联系”:{“电子邮件”:“[电子邮件受保护]“,”电话“:”9999999999“}}}

让我们将输入的JSON读取为JsonNode和比较:

assertequal (mapper.readTree (s1), mapper.readTree (s2));

再次,我们应该注意到这一点equals ()还可以比较带有嵌套元素的两个输入JSON对象。

3.3。比较两个包含List元素的JSON对象

同样,我们还可以比较包含列表元素的两个JSON对象。

让我们考虑这个JSON定义为s1:

{“员工”:{“id”:“1212”,“fullname”:“John Miles”,“年龄”:34,“技能”:[“Java”,“C ++”,“Python”]}}

我们将它与另一个JSON进行比较s2:

{“员工”:{“id”:“1212”,“年龄”:34,“fullname”:“John Miles”,“技能”:[java“,”c ++“,”python“]}}

让我们将输入的JSON读取为JsonNode和比较:

assertequal (mapper.readTree (s1), mapper.readTree (s2));

知道这一点很重要只有当两个列表元素以完全相同的顺序具有相同的值时,才作为相等进行比较。

4.使用自定义比较器比较两个JSON对象

JsonNode.equals在大多数情况下都能很好地工作。杰克逊还提供了JsonNode.equals(comparator, JsonNode)要配置自定义Java Comparator对象。让我们了解如何使用自定义比较器

4.1。用于比较数值的自定义比较器

让我们了解如何使用自定义比较器比较两个具有数值的JSON元素。

我们将使用这个JSON作为输入s1:

{"name": "John", "score": 5.0}

让我们与另一个定义为的JSON进行比较s2:

{"name": "John", "score": 5}

我们需要观察到这一点属性的值分数在输入s1s2都不一样。

让我们将输入的JSON读取为JsonNode和比较:

JsonNode actualObj1 = mapper.readTree(s1);JsonNode actualObj2 = mapper.readTree(s2);assertNotEquals (actualObj1 actualObj2);

我们可以注意到,两个对象不等于。标准equals ()方法认为值5.0和值5是不同的。

然而,我们可以使用定制比较器比较值5和5。0,并将它们等同对待

让我们先创建一个比较器比较两个NumericNode对象:

public class NumericNodeComparator implements Comparator {@Override public int compare(JsonNode o1, JsonNode o2) {if (o2 .equals(o2)){return 0;} if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)){Double d1 = (((NumericNode) o1).asDouble());Double d2 = ((NumericNode) o2).asDouble();if (d1.compareTo(d2) == 0) {return 0;}}返回1;}}

接下来,让我们看看如何使用它比较器:

cmp = new NumericNodeComparator();assertTrue (actualObj1。actualObj2 equals (cmp));

4.2。用于比较文本值的自定义比较器

让我们看看另一个自定义示例比较器出于不区分大小写的比较两个JSON值。

我们将使用这个JSON作为输入s1:

{“姓名”:“John”,“得分”:5}

让我们与另一个定义为的JSON进行比较s2:

{“姓名”:“John”,“得分”:5}

正如我们所看到的属性的名字是小写的输入s1和大写字母s2

让我们先创建一个比较器比较两个textnode.对象:

public class TextNodeComparator implements Comparator {@Override public int compare(JsonNode o1, JsonNode o2) {if (o2 .equals(o2)) {return 0;} if ((o1 instanceof TextNode) && (o2 instanceof TextNode)) {String s1 = ((TextNode) o1).asText();字符串s2 = ((TextNode) o2).asText();if (s1.equalsIgnoreCase(s2)) {return 0;}}返回1;}}

让我们看看如何比较s1s2使用TextNodeComparator:

JsonNode actualObj1 = mapper.readTree(s1);JsonNode actualObj2 = mapper.readTree(s2);TextNodeComparator cmp = new TextNodeComparator();assertNotEquals (actualObj1 actualObj2);assertTrue (actualObj1。actualObj2 equals (cmp));

最后,我们可以在比较两个JSON对象时使用自定义比较器对象当输入的JSON元素值并不完全相同,但我们仍然希望将它们视为相等时,这将非常有用。

5.结论

在这个快速的教程中,我们已经看到了如何使用杰克逊比较两个JSON对象并使用自定义比较器

当然,和往常一样,可以找到这里讨论的所有示例的完整源代码在github上

杰克逊底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
评论在本文上关闭!