2013-07-18 14 views
7

Z powodów związanych z projektem, nad którym pracuję, chciałbym, aby całe zapytanie do pliku JSON było przechowywane jako ciąg znaków, na przykład $.store.book[*].title (zamiast konieczności tymczasowego przechowywania każdego poziomu dokumentu jako oddzielnego obiektu).JsonPath NoClassDefFoundError lub alternatywa dla JsonPath w Javie

Używam obecnie JsonPath (wersja 0.8.0, która była najnowszą możliwą do znalezienia), która jest dokładnie tym, czego szukam, ale otrzymuję wyjątek pokazany poniżej. Używam przykładowego JSON podanego na stronie kodowej Google'a JsonPath, używając jednego z ich przykładowych zapytań.

Co ja tu robię źle? Alternatywnie, jeśli nie ma rozwiązania, czy istnieją alternatywy dla JsonPath w Javie? Chcę móc przekazać całe zapytanie jako ciąg znaków i musi to być Java.

Funkcja:

public void testJsonPath() throws Exception 
{ 
    String query = "$.store.book[*].title"; 
    List toRet = (List) JsonPath.read(practiceJson, query, new Filter[0]); 
    System.out.println(toRet.toString()); 
} 

Wyjątek:

java.lang.NoClassDefFoundError: net/minidev/json/parser/ParseException 
at com.jayway.jsonpath.spi.JsonProviderFactory$1.create(JsonProviderFactory.java:27) 
at com.jayway.jsonpath.spi.JsonProviderFactory.createProvider(JsonProviderFactory.java:32) 
at com.jayway.jsonpath.JsonPath.read(JsonPath.java:202) 
at com.jayway.jsonpath.JsonPath.read(JsonPath.java:307) 
at net.windward.datasource.test.TestJsonDataSource.testJsonPath(TestJsonDataSource.java:119) 

JSON praktyka:

private String practiceJson = "{\n" + 
     " \"store\": {\n" + 
     "  \"book\": [ {\n" + 
     "   \"category\": \"reference\",\n" + 
     "   \"author\": \"Nigel Rees\",\n" + 
     "   \"title\": \"Sayings of the Century\",\n" + 
     "   \"price\": 8.95\n" + 
     "  }, {\n" + 
     "   \"category\": \"fiction\",\n" + 
     "   \"author\": \"Evelyn Waugh\",\n" + 
     "   \"title\": \"Sword of Honour\",\n" + 
     "   \"price\": 12.99\n" + 
     "  }, {\n" + 
     "   \"category\": \"fiction\",\n" + 
     "   \"author\": \"Herman Melville\",\n" + 
     "   \"title\": \"Moby Dick\",\n" + 
     "   \"isbn\": \"0-553-21311-3\",\n" + 
     "   \"price\": 8.99\n" + 
     "  }, {\n" + 
     "   \"category\": \"fiction\",\n" + 
     "   \"author\": \"J. R. R. Tolkien\",\n" + 
     "   \"title\": \"The Lord of the Rings\",\n" + 
     "   \"isbn\": \"0-395-19395-8\",\n" + 
     "   \"price\": 22.99\n" + 
     "  } ],\n" + 
     "  \"bicycle\": [ {\n" + 
     "   \"color\": \"red\",\n" + 
     "   \"price\": 19.95,\n" + 
     "   \"style\": [ \"city\", \"hybrid\" ]\n" + 
     "  }, {\n" + 
     "   \"color\": \"blue\",\n" + 
     "   \"price\": 59.91,\n" + 
     "   \"style\": [ \"downhill\", \"freeride\" ]\n" + 
     "  } ]\n" + 
     " }\n" + 
     "}"; 

Odpowiedz

8

Jeśli używasz Maven lub Gradle, wystarczy dodać do swojej listy zależności:

Dla projektów Maven:

W swojej Mavenpom.xml pliku:

<dependency> 
    <groupId>com.jayway.jsonpath</groupId> 
    <artifactId>json-path</artifactId> 
    <version>2.2.0</version> 
    <scope>test</scope> 
</dependency> 

Dla projektów Gradle:

W zależności rozdział w swojej Gradlebuild.gradle pliku

testCompile 'com.jayway.jsonpath:json-path:2.2.0' 

Powinien działać

+0

Nie wiem, dlaczego to nie działa dla mnie. Jeśli sprawdzam zależności, widzę, że jsonPath został poprawnie dodany do testów, ale zawsze mam ten wyjątek. –

0

Gdy istnieją sprzeczne wersje json-smart, jeśli starsza wersja jest odbierany która robi nie mają oczekiwanej klasy.

Jak naprawić

Sprawdź wersje z mvn dependency:tree.

Poniżej znajduje się net.minidev:json-smart:jar:1.1.1:compile i com.jayway.jsonpath:json-path:jar:1.1.0:test, która korzysta z najnowszej wersji json-smart.

$ mvn clean dependency:tree | grep json 
[INFO] +- net.logstash.log4j:jsonevent-layout:jar:1.7:compile 
[INFO] | +- net.minidev:json-smart:jar:1.1.1:compile 
[INFO] | +- io.spray:spray-json_2.11:jar:1.3.3:compile 
[INFO] | +- org.json:json:jar:20160810:compile 
[INFO] +- com.github.fge:json-schema-validator:jar:2.2.6:compile 
[INFO] | +- com.github.fge:json-schema-core:jar:1.2.5:compile 
[INFO] | | +- org.skyscreamer:jsonassert:jar:1.4.0:test 
[INFO] | | | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test 
[INFO] +- com.jayway.jsonpath:json-path:jar:1.1.0:test 
[INFO] | | | | +- io.gatling:jsonpath_2.10:jar:0.6.1:test 
[INFO] | | | | +- io.fastjson:boon:jar:0.28:test 

więc wykluczyć wersję json-smart od uzależnienia jako json-path posiada najnowszą wersję json-smart.

np.

<dependency> 
     <groupId>net.logstash.log4j</groupId> 
     <artifactId>jsonevent-layout</artifactId> 
     <version>1.7</version> 
     <scope>compile</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>net.minidev</groupId> 
       <artifactId>json-smart</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency>