私が取り組んでいるプロジェクトに関連する理由により、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" +
"}";
これらの依存関係をプロジェクトに追加する必要があると思います: 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。
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'
うまくいくはず
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>