2013-07-18 11 views
7

Per ragioni correlate al progetto su cui sto lavorando, vorrei un'intera query in un file JSON da tenere come stringa, ad esempio, $.store.book[*].title (anziché dover memorizzare temporaneamente ciascun livello del documento come oggetto separato).JsonPath NoClassDefFoundError o un'alternativa a JsonPath in Java

Attualmente sto usando JsonPath (versione 0.8.0, che era l'ultima che ho trovato), che è fondamentalmente esattamente quello che sto cercando, ma sto ricevendo l'eccezione mostrata di seguito. Sto solo utilizzando il JSON di esempio fornito nella codepage di google di JsonPath, utilizzando una delle loro query di esempio.

Cosa sto facendo di sbagliato qui? In alternativa, se non c'è una soluzione, ci sono alternative a JsonPath in Java? Voglio essere in grado di passare un'intera query come una stringa, e deve essere in Java.

La funzione:

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()); 
} 

L'eccezione:

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) 

Il JSON pratica:

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" + 
     "}"; 

risposta

8

Se si utilizza Maven o Gradle, solo bisogno di aggiungere questo alla vostra lista delle dipendenze:

Per i progetti Maven:

Nella tua Mavenpom.xml di file:

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

Per progetti Gradle:

Negli dipendenze sezione del Gradlebuild.gradle file di

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

Dovrebbe funzionare

+0

Non so perché non mi funzioni. Se controllo le dipendenze posso vedere jsonPath correttamente aggiunto ai test ma ho sempre quell'eccezione. –

0

Quando ci sono versioni contrastanti di json-smart, se la versione precedente viene raccolto che fa non avere la classe prevista

Come risolvere

verificare le versioni con mvn dependency:tree.

Sotto, c'è net.minidev:json-smart:jar:1.1.1:compile e com.jayway.jsonpath:json-path:jar:1.1.0:test che utilizza l'ultima versione di 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 

Così, esclude la versione precedente di json-smart dalla dipendenza come json-path ha ultima versione di json-smart.

es.

<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> 
Problemi correlati