2015-12-05 23 views
10

Büyük bir json belgesi alıyorum ve bunun yalnızca bir kısmını java sınıflarıma ayrıştırmak istiyorum. Java sınıflarının tüm hiyerarşisini oluşturmak yerine, kısmi verileri ayıklamak için jsonpath gibi bir şey kullanmayı düşünüyordum.Jsonpath, Jackson veya Gson ile

Jackson veya Gson, jsonpath'ı herhangi bir şekilde destekliyor mu? Eğer evet ise, bana bazı örnekler verebilir misiniz veya bu amaç için başka bir standart kütüphaneye işaret edebilir misiniz? Sadece ilk kitabı $ .store.bicycle -

$ .store.book [0]: Örneğin

i aşağıdaki belgeyi varsa ve benim java sınıflarında ondan sadece verilerinin altındaki ayıklamak istiyorum Diyelim .price - bisiklet

{ 
    "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

Bu iki kitaplığın hiçbiri yerel jsonpath desteğine sahip değildir; Jackson üzerinde çalışan bir kütüphane var. – fge

cevap

11

Jayway JsonPath kütüphane fiyatı JSON yolu kullanarak değerleri okumak için desteği vardır. Örneğin

:

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 

Ayrıca JSON GSON veya Jackson gibi sınıflara doğrudan nesneleri bağlanabilirler: Özellikle yapmaya GSON veya Jackson kullanmak istiyorsanız

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} 

deserialization (varsayılan json-smart kullanmaktır), bunu da yapılandırabilirsiniz:

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

Daha fazla bilgi için the documentation'a bakın.