首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonPath NoClassDefFoundError,或Java中JsonPath的替代方案

JsonPath NoClassDefFoundError,或Java中JsonPath的替代方案
EN

Stack Overflow用户
提问于 2013-07-18 22:26:54
回答 3查看 35.8K关注 0票数 15

由于与我正在从事的项目相关的原因,我希望对JSON文件的整个查询以字符串形式保存,例如,$.store.book[*].title (而不必将文档的每一层临时存储为单独的对象)。

我目前使用的是JsonPath ( 0.8.0版本,这是我能找到的最新版本),这基本上就是我想要的,但我得到了如下所示的异常。我只是使用了JsonPath google代码页上给出的示例JSON,并使用了他们的一个示例查询。

我在这里做错了什么?或者,如果没有解决方案,在Java语言中有没有JsonPath的替代品?我希望能够将整个查询作为字符串传递,而且它必须是Java格式的。

函数:

代码语言:javascript
复制
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());
}

例外情况是:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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" +
        "}";
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-18 23:06:04

我认为您必须将这些依赖项添加到项目中: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,其中包含缺少的异常类。

票数 21
EN

Stack Overflow用户

发布于 2016-05-10 23:40:17

如果您使用的是Maven或Gradle,只需将以下代码添加到您的依赖项列表中:

对于Maven项目:

在您的Maven pom.xml文件中:

代码语言:javascript
复制
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
    <scope>test</scope>
</dependency>

对于Gradle项目:

Gradle build.gradle文件的依赖项部分中

代码语言:javascript
复制
    testCompile 'com.jayway.jsonpath:json-path:2.2.0'

它应该是可行的

票数 23
EN

Stack Overflow用户

发布于 2017-05-07 18:47:56

当存在冲突的json-smart版本时,如果选择了没有预期类的旧版本。

如何修复

使用mvn dependency:tree验证版本。

下面是使用最新版本json-smartnet.minidev:json-smart:jar:1.1.1:compilecom.jayway.jsonpath:json-path:jar:1.1.0:test

代码语言:javascript
复制
$ 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

例如:

代码语言:javascript
复制
    <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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17726282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档