2015-12-05 18 views
10

Sto ottenendo un documento json grande e voglio analizzare solo una parte di esso nelle mie classi java. Stavo pensando di usare qualcosa come jsonpath per estrarre i dati parziali da esso invece di creare l'intera gerarchia delle classi java.Jsonpath con Jackson o Gson

Jackson o Gson supportano jsonpath in qualche modo? Se sì, puoi fornirmi qualche esempio o indicarmi un'altra libreria standard per questo scopo?

Per esempio Diciamo che ho un documento qui sotto e voglio estrarre solo al di sotto dei dati da esso nelle mie classi Java:

$ .store.book [0] - Solo il primo libro $ .store.bicycle .price - prezzo di bicicletta

{ 
    "store": { 
     "book": [ 
      { 
       "category": "reference", 
       "author": "Nigel Rees", 
       "title": "Sayings of the Century", 
       "price": 8.95 
      }, 
      { 
       "category": "fiction", 
       "author": "Evelyn Waugh", 
       "title": "Sword of Honour", 
       "price": 12.99 
      }, 
      { 
       "category": "fiction", 
       "author": "Herman Melville", 
       "title": "Moby Dick", 
       "isbn": "0-553-21311-3", 
       "price": 8.99 
      }, 
      { 
       "category": "fiction", 
       "author": "J. R. R. Tolkien", 
       "title": "The Lord of the Rings", 
       "isbn": "0-395-19395-8", 
       "price": 22.99 
      } 
     ], 
     "bicycle": { 
      "color": "red", 
      "price": 19.95 
     } 
    }, 
    "expensive": 10 
} 
+0

Nessuna di queste due librerie supporta il supporto nativo di jsonpath; esiste però una libreria che funziona su Jackson però. – fge

risposta

11

La libreria Jayway JsonPath ha il supporto per la lettura dei valori utilizzando un percorso JSON.

Ad esempio:

String json = "..."; 

Map<String, Object> book = JsonPath.read(json, "$.store.book[0]"); 
System.out.println(book); // prints {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95} 

Double price = JsonPath.read(json, "$.store.bicycle.price"); 
System.out.println(price); // prints 19.95 

È anche possibile mappare JSON oggetti direttamente alle classi, come in GSON o Jackson:

Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class); 
System.out.println(book); // prints Book{category='reference', author='Nigel Rees', title='Sayings of the Century', price=8.95} 

Se si desidera utilizzare per specificamente GSON o Jackson per fare il deserializzazione (l'impostazione predefinita è usare json-smart), è anche possibile configurarlo:

Configuration.setDefaults(new Configuration.Defaults() { 
    private final JsonProvider jsonProvider = new JacksonJsonProvider(); 
    private final MappingProvider mappingProvider = new JacksonMappingProvider(); 

    @Override 
    public JsonProvider jsonProvider() { 
     return jsonProvider; 
    } 

    @Override 
    public MappingProvider mappingProvider() { 
     return mappingProvider; 
    } 

    @Override 
    public Set<Option> options() { 
     return EnumSet.noneOf(Option.class); 
    } 
}); 

Vedere the documentation per ulteriori dettagli.