2016-06-23 39 views
10

Jackson'un ObjectMapper unmarshall öğesinin bir JSON ağacında yalnızca belirli bir düğümden (ve 'aşağı') olması mümkün mü?JSON ağacındaki belirli düğümden nesneyi eşlemek için Jackson'ı kullanma

Kullanım durumu genişletilebilir bir belge biçimidir. Ağaca yürümek ve daha sonra, kullanıcının kullandığını ve belgenin bu bölümüyle ne yapacağını bilecek eklentileri görmek için geçerli yolu genişletilebilir eklenti kümesine yayınlamak istiyorum.

Eklenti yazarlarının, JsonNode'un alt düzey ayrıntılarını veya akış API'sini ele almaları gerekmeyeceğini; bunun yerine, yalnızca bir bağlamı ve belirli bir JsonNode'u geçirin ve daha sonra, ağacın kökü olarak iletilen düğümü dikkate alarak, sınıfının bir örneğini açığa çıkarmak için güzel ve kullanışlı ObjectMapper'u kullanabileceksiniz.

+1

Tam olarak bunun gibi sesler: http://martinfowler.com/articles/refactoring-document-load.html#CreatingObjectsDeepInTheDocumentStructure –

cevap

13

aşağıdaki JSON düşünün:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": { 
    "street": "21 2nd Street", 
    "city": "New York", 
    "postalCode": "10021-3100", 
    "coordinates": { 
     "latitude": 40.7250387, 
     "longitude": -73.9932568 
    } 
    } 
} 

Ve aşağıdaki Java sınıfa coordinates düğüm ayrıştırmak istiyor düşünün: Bir içine bütün JSON ayrıştırmak,

public class Coordinates { 

    private Double latitude; 

    private Double longitude; 

    // Default constructor, getters and setters omitted 
} 

bunu yapmak içinile ObjectMapper:

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":" 
      + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\"," 
      + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 

Sonra coordinates düğüm sorgulamak için JSON Pointer kullanıp Coordinates sınıfa ayrıştırmak ObjectMapper kullanın:

JsonNode coordinatesNode = node.at("/address/coordinates"); 
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class); 

JSON Pointer JSON çapraz bir yol dildir. Daha fazla ayrıntı için RFC 6901'u kontrol edin. Bu sürüm 2.3'ten beri Jackson'ta mevcuttur.

+1

Tam olarak neyse peşindeyim! Bunu uygulamak için bir şansım olduğunda, ödül vereceğim. –

+0

"node.get (" address ")' ifadesinin bu durum için daha basit/daha etkili olduğunu söyleyebilirim. – shmosel

+1

@shmosel Elbette öyle. Ama burada nokta, bir düğüm için sorgulamak için kullanılabilecek JSON Yoludur. Örnek olarak verdiğim JSON gerçekten çok basit ve JSON Yolunun kullanılmasının avantajlarını göremiyoruz. –