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>