【问题标题】:JsonPath NoClassDefFoundError, or an alternative to JsonPath in JavaJsonPath NoClassDefFoundError,或 Java 中 JsonPath 的替代方案
【发布时间】:2013-07-17 13:40:46
【问题描述】:

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

我目前正在使用 JsonPath(版本 0.8.0,这是我能找到的最新版本),这基本上正是我正在寻找的,但我得到了下面显示的异常。我只是使用 JsonPath 谷歌代码页上给出的示例 JSON,使用他们的示例查询之一。

我在这里做错了什么?或者,如果没有解决方案,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" +
        "}";

【问题讨论】:

    标签: java json jsonpath


    【解决方案1】:

    如果您使用的是 MavenGradle,只需将其添加到您的依赖项列表中:

    对于 Maven 项目:

    在您的 Maven pom.xml 文件中:

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.2.0</version>
        <scope>test</scope>
    </dependency>
    

    对于 Gradle 项目:

    Gradle build.gradle 文件的 dependencies 部分中

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

    它应该可以工作

    【讨论】:

    • 我不知道为什么它对我不起作用。如果我检查依赖项,我可以看到 jsonPath 正确添加到测试中,但我总是有那个异常。
    • 刷新您的项目,然后进行 gradle refresh(在 Eclipse 上,右键单击 Project > Gradle > Refresh Gradle Project)应该这样做。
    • 我无法使 jsonPath(...) 的静态导入工作。它找不到包“matchers”。我正在使用 gradle。
    【解决方案2】:

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

    如何解决

    使用mvn dependency:tree 验证版本。

    下面是net.minidev:json-smart:jar:1.1.1:compilecom.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>
    

    【讨论】:

      【解决方案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,其中包含缺少的 Exception 类。

      【讨论】:

      • 啊哈,就是这样!非常感谢!
      • 谢谢,添加所有依赖项后它对我有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2018-12-20
      相关资源
      最近更新 更多