アンドリュー:
私が使用していジャクソン JSONライブラリーとそのツリーモデルのシステム(JsonNode
私のJavaアプリケーションでは)。この中で、私がいるかどうかを確認する必要がArrayNode
与えられたが含まれていますJsonNode
。私はのJavaDocを見たと私はの任意の並べ替え表示されませんでし.contains()
ための方法をArrayNode
。私は含まれていた方法を自分で書くことになりました。
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));
}
私はジャクソンで何かを欠場し、私は逃したいくつかのライブラリー方法を複製しています。そうでなければ、私が何をしたかよりも、これを行うための良い方法はありますか?
user7294900:
使用してのオプションがあります等しい JsonNodeと比較してメソッドを
渡されたコンパレータのオブジェクトを使用して、カスタマイズ可能な比較を呼び出すための入力方法。ノードは、構造化型(配列オブジェクト)のトラバーサルが、スカラー値を比較するためのコンパレータに延期を処理します
追加するための新しい拡張機能790 JsonNode.equals(コンパレータ、JsonNode) 、設定/外部の等価比較をサポートするために:
// 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));