2013-07-18 3 views
7

По причинам, связанным с проектом, над которым я работаю, мне бы хотелось, чтобы весь запрос к файлу JSON содержался в виде строки, например, $.store.book[*].title (а не чтобы временно сохранить каждый уровень документа как отдельный объект).JsonPath NoClassDefFoundError, или альтернатива JsonPath в Java

В настоящее время я использую JsonPath (версия 0.8.0, которая была последней, которую я смог найти), что в основном именно то, что я ищу, но я получаю исключение, показанное ниже. Я просто использую образец JSON, указанный на кодовой странице Google JsonPath, используя один из своих примерных запросов.

Что я здесь делаю неправильно? Альтернативно, если нет решения, есть ли альтернативы JsonPath в Java? Я хочу иметь возможность передать весь запрос в виде строки, и он должен быть в Java.

Функция:

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()); 
} 

Исключение:

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:

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" + 
     "}"; 

ответ

16

Я думаю, вы должны добавить эти зависимости для вашего проекта: https://code.google.com/p/json-path/downloads/detail?name=json-path-0.8.0-dependencies.zip&can=2&q=

В частности, json-smart-1.1.jar, где содержится отсутствующий класс исключения.

+0

Ага, это было! Большое спасибо! – firechant

+0

Спасибо, stackoverflow: D – cegprakash

+0

Спасибо, он работает для меня после добавления всех зависимостей. – Ravikumar11

8

Если Вы используете Maven или Gradle, просто нужно добавить это в список зависимостей:

Для проектов Maven:

В вашем Mavenpom.xml файла:

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

Для проектов Gradle:

В зависимостей раздел в вашем Gradlebuild.gradle файл

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

Он должен работать

+0

Я не знаю, почему это не работает для меня. Если я проверю зависимости, я вижу, что jsonPath правильно добавлен в тесты, но у меня всегда есть это исключение. –

0

Когда существуют противоречивые версии json-smart, если старая версия определена, которая делает не имеют ожидаемого класса.

Как исправить

Проверьте версии с mvn dependency:tree.

Ниже приведены net.minidev:json-smart:jar:1.1.1:compile и com.jayway.jsonpath:json-path:jar:1.1.0:test, который использует последнюю версию 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 

Таким образом, исключить старую версию json-smart от зависимости, как json-path имеет последнюю версию json-smart.

например.

<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>