Wie Suche ich ein array mit JSONPath in Java?
Ich möchte schreiben Sie einen unit test für eine web service mit json-Pfad-geltend zu machen. Angesichts dieses JSON:
[
["Some short name","Some parent","Some name"],
["Some short name 2","Some parent 2","Some name 2"]
]
Möchte ich überprüfen, dass die Eltern von "Einige Namen 2" ist "ein Eltern-2". Ich kann nicht ändern Sie die Struktur von JSON, da es diktiert von einer Drittanbieter-Bibliothek.
Hier ist die JSONPath Ausdruck, die ich kam mit:
$..[?(@[2] == 'Some name 2')][1]
Dieser Ausdruck funktioniert gut und gibt gibt das erwartete Ergebnis ("Einige Eltern 2') in dieses JSON-tool. Allerdings, wenn Sie es in Java mit der JSONPath Bibliothek bekomme ich ein leeres Ergebnis anstelle des richtigen Wertes:
import com.jayway.jsonpath.JsonPath;
import org.junit.Test;
public class TestJSONPath
{
@Test
public void testJsonPath() {
String json = "[[\"Some short name\",\"Some parent\",\"Some name\"]," +
"[\"Some short name 2\",\"Some parent 2\",\"Some name 2\"]]";
System.out.println(JsonPath.read(json, "$[1][1]")); //OK, returns 'Some parent 2'
System.out.println(JsonPath.read(json, "$..[?(@[2] == 'Some name 2')][1]")); //Not OK, returns an empty list
}
}
Hier ist meine pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path-assert</artifactId>
<version>2.1.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Könnten Sie mir bitte helfen mit Ideen, um dieses Problem zu beheben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das funktionieren könnte:
$[?(@[2] == 'Some name 2')][1]
Hintergrund:
Wenn Sie versuchen, die "original" JSONPath Umsetzung geschrieben von Stefan Goessner, der folgende Ausdruck gibt das erwartete array:
$..[?(@[2] == 'Some name 2')]
(ein Nachkomme wo der Wert an index 2 'irgendein name 2')===> ["Some parent 2"]
Es ist interessant... versuchen Sie diese Ausdrücke mit jayway, Goessners-JSON-lib oder jsonquerytool :
Stefan Goessner die JavaScript-Bibliothek gibt das gleiche wie die "jayway" Umsetzung. Aber "jsonquerytool" gibt
false
für$
- das ist definitiv falsch.$
ist "das root-Objekt/element".Und für
$..*
dies ist das gleiche Ergebnis bei allen drei Varianten:So
$..[?(@[2] == 'Some name 2')]
sollte mit dem array mit dem index '1'... meiner Meinung nach, jayway, ist etwas falsch.Goessner ist der Erfinder von JSONPath - so seine Umsetzung ist die richtige Art und Weise!!! ?
Zusammenfassung: jsonquerytool und jayway Implementierungen sind falsch.
Überraschend diese Abfrage arbeitet wie erwartet in allen Implementierungen (obwohl
$
istfalse
im jsonquerytool)auch diese version funktioniert: