Jackson:检查ArrayNode是否包含JsonNode
Jackson: Check if ArrayNode contains JsonNode
我在我的 Java 应用程序中使用 Jackson JSON 库及其 树模型 系统 (JsonNode
) .在此,我需要检查 ArrayNode
是否包含给定的 JsonNode
。我正在查看 Java 文档,但没有看到 ArrayNode
的任何类型的 .contains()
方法。我最终自己编写了一个包含方法:
public static boolean arrayNodeContains(ArrayNode arrayNode, JsonNode node) {
Stream<JsonNode> nodeStream = StreamSupport.stream(arrayNode.spliterator(), false);
return nodeStream.anyMatch(j -> j.equals(node));
}
单元测试:
@Test
public void testArrayNodeContains()
throws IOException
{
ObjectMapper mapper = new ObjectMapper;
String arrayJsonString = "[{\"foo\":\"bar\"},{\"foo\":\"baz\"},{\"baz\":\"bar\"}]";
String nodeTrueJsonString = "{\"foo\":\"bar\"}";
String nodeFalseJsonString = "{\"foo\":\"brains\"}";
List<Object> list = mapper.readValue(arrayJsonString, List.class);
ArrayNode arrayNode = mapper.valueToTree(list);
Map<String, Object> nodeTrueMap = mapper.readValue(nodeTrueJsonString, Map.class);
JsonNode nodeTrue = mapper.valueToTree(nodeTrueMap);
assertTrue(arrayNodeContains(arrayNode, nodeTrue));
Map<String, Object> nodeFalseMap = mapper.readValue(nodeFalseJsonString, Map.class);
JsonNode nodeFalse = mapper.valueToTree(nodeFalseMap);
assertFalse(arrayNodeContains(arrayNode, nodeFalse));
}
我是不是错过了 Jackson 中的某些东西,我正在复制我错过的一些库方法。否则,有没有比我做的更好的方法?
可以选择将 equals 方法与 JsonNode 和 Comparator
一起使用
Entry method for invoking customizable comparison, using passed-in Comparator object. Nodes will handle traversal of structured types (arrays, objects), but defer to comparator for scalar value comparisons
用于添加 JsonNode.equals(Comparator, JsonNode) 以支持 configurable/external 相等比较的新增强功能 790:
// but. Custom comparator can make all the difference
Comparator<JsonNode> cmp = new Comparator<JsonNode>() {
@Override
public int compare(JsonNode o1, JsonNode o2) {
if (o1.equals(o2)) {
return 0;
}
if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) {
double d1 = ((NumericNode) o1).asDouble();
double d2 = ((NumericNode) o2).asDouble();
if (d1 == d2) { // strictly equals because it's integral value
return 1;
}
}
return 0;
}
};
// but with custom comparator, yes
assertTrue(root1.equals(cmp, root2));
我在我的 Java 应用程序中使用 Jackson JSON 库及其 树模型 系统 (JsonNode
) .在此,我需要检查 ArrayNode
是否包含给定的 JsonNode
。我正在查看 Java 文档,但没有看到 ArrayNode
的任何类型的 .contains()
方法。我最终自己编写了一个包含方法:
public static boolean arrayNodeContains(ArrayNode arrayNode, JsonNode node) {
Stream<JsonNode> nodeStream = StreamSupport.stream(arrayNode.spliterator(), false);
return nodeStream.anyMatch(j -> j.equals(node));
}
单元测试:
@Test
public void testArrayNodeContains()
throws IOException
{
ObjectMapper mapper = new ObjectMapper;
String arrayJsonString = "[{\"foo\":\"bar\"},{\"foo\":\"baz\"},{\"baz\":\"bar\"}]";
String nodeTrueJsonString = "{\"foo\":\"bar\"}";
String nodeFalseJsonString = "{\"foo\":\"brains\"}";
List<Object> list = mapper.readValue(arrayJsonString, List.class);
ArrayNode arrayNode = mapper.valueToTree(list);
Map<String, Object> nodeTrueMap = mapper.readValue(nodeTrueJsonString, Map.class);
JsonNode nodeTrue = mapper.valueToTree(nodeTrueMap);
assertTrue(arrayNodeContains(arrayNode, nodeTrue));
Map<String, Object> nodeFalseMap = mapper.readValue(nodeFalseJsonString, Map.class);
JsonNode nodeFalse = mapper.valueToTree(nodeFalseMap);
assertFalse(arrayNodeContains(arrayNode, nodeFalse));
}
我是不是错过了 Jackson 中的某些东西,我正在复制我错过的一些库方法。否则,有没有比我做的更好的方法?
可以选择将 equals 方法与 JsonNode 和 Comparator
一起使用Entry method for invoking customizable comparison, using passed-in Comparator object. Nodes will handle traversal of structured types (arrays, objects), but defer to comparator for scalar value comparisons
用于添加 JsonNode.equals(Comparator, JsonNode) 以支持 configurable/external 相等比较的新增强功能 790:
// but. Custom comparator can make all the difference Comparator<JsonNode> cmp = new Comparator<JsonNode>() { @Override public int compare(JsonNode o1, JsonNode o2) { if (o1.equals(o2)) { return 0; } if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) { double d1 = ((NumericNode) o1).asDouble(); double d2 = ((NumericNode) o2).asDouble(); if (d1 == d2) { // strictly equals because it's integral value return 1; } } return 0; } }; // but with custom comparator, yes assertTrue(root1.equals(cmp, root2));