web-dev-qa-db-ja.com

JsonPath NoClassDefFoundError、またはJavaのJsonPathの代替

私が取り組んでいるプロジェクトに関連する理由により、JSONファイルへのクエリ全体を、たとえば$.store.book[*].title(ドキュメントの各レベルを一時的に保存する必要がないのではなく)文字列として保持したい別のオブジェクトとして)。

私は現在JsonPath(バージョン0.8.0、これは私が見つけることができる最新のものでした)を使用しています。これは基本的に私が探しているものですが、以下に示す例外が発生します。私は、JsonPathのgoogleコードページで提供されているサンプルJSONを、サンプルクエリの1つを使用して使用しています。

ここで何が悪いのですか?または、解決策がない場合、JavaのJsonPathに代わるものはありますか?クエリ全体を文字列として渡せるようにしたいのですが、それは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" +
        "}";
14
firechant

これらの依存関係をプロジェクトに追加する必要があると思います: https://code.google.com/p/json-path/downloads/detail?name=json-path-0.8.0-dependencies.Zip&can= 2&q =

特に、不足しているExceptionクラスが含まれているjson-smart-1.1.jar。

19
Fedy2

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ファイルのdependenciesセクション

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

うまくいくはず

16
JorelC

json-smartのバージョンが競合している場合、予期されたクラスがない古いバージョンが選択されます。

修正方法

mvn dependency:treeでバージョンを確認します。

以下に、最新バージョンのnet.minidev:json-smart:jar:1.1.1:compileを使用するcom.jayway.jsonpath:json-path:jar:1.1.0:testjson-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>
1
prayagupd