Jsonpath NoClassDefFoundError или альтернатива JsonPath в Java
по причинам, связанным с проектом, над которым я работаю, я хотел бы, чтобы весь запрос к файлу JSON содержался в виде строки, например,$.store.book[*].title
(вместо того, чтобы хранить каждый уровень документа временно как отдельный объект).
в настоящее время я использую JsonPath (версия 0.8.0, которая была последней, которую я мог найти), что в основном именно то, что я ищу, но я получаю исключение, показанное ниже. Я просто использую пример JSON, приведенный в коде jsonpath google page, используя один из своих примеров запросов.
что я здесь делаю не так? В качестве альтернативы, если нет решения, есть ли альтернативы 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.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.95n" +
" }, {n" +
" "category": "fiction",n" +
" "author": "Evelyn Waugh",n" +
" "title": "Sword of Honour",n" +
" "price": 12.99n" +
" }, {n" +
" "category": "fiction",n" +
" "author": "Herman Melville",n" +
" "title": "Moby Dick",n" +
" "isbn": "0-553-21311-3",n" +
" "price": 8.99n" +
" }, {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.99n" +
" } ],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" +
"}";
3 ответов
Я думаю, вам нужно добавить эти зависимости в свой проект: 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, где содержится отсутствующий класс исключений.
Если вы используете Maven или ш , просто нужно добавить это в список зависимостей:
проектов Maven:
в своем Maven пом.в XML:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
для проектов Gradle:
на зависимости в своем ш построить.Gradle в
testCompile 'com.jayway.jsonpath:json-path:2.2.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>