2016-06-21 39 views
7

Bu, oldukça çözülmüş/iyi adreslenmiş bir sorun olması gerektiği gibi görünüyor, ancak bu konuda bir rehberlik bulamıyorum - bunun bir dupe olmadığına inanıyorum. Açıkçası bu basitleştirilmişJSON yanıtıyla iç içe geçmiş nesnelerden seri hale getirme alanlarının Jackson ile eşleştirilmesi

{ 
    "objects": [...], 
    "meta": { 
    "total": 5000, 
    "page": 1, 
    "result_pages": 20, 
    "links": { 
     "prev": null, 
     "next": "/api/v3/objects/somequery?page=2" 
    } 
    } 
} 

, ama umarım bu nokta üzerinde olur:

Benim senaryo ben sayfalandırılmış JSON şuna benzer tepkiler tüketen olduğumu temelde.

Gerçekten önemsediğim

objects ve next alanlar vardır, ama başarılı iç içe alanları serisini DTOs bir bütün hiyerarşi oluşturmak gerekecek gibi görünüyor.

Bütün bunları atlatan bir jackson ek açıklaması var mı? Değilse, çoğunlukla boş sınıflar ve dosyalar barındıran bir dizi en iyi uygulama var mı?

cevap

8

Tüm bunlara izin vermeme izin veren bir jackson ek açıklaması var mı?

JsonDeserialize ve özel JsonDeserializer'ı tanımlayabilirsiniz.

class MetaDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { 
     JsonNode tree = jp.readValueAsTree(); 
     return tree.get("links").get("next").asText(); 
    } 
} 

Burada basit bir harita serileştirme işlemi kullandım, ancak isterseniz hızlı seri hale getirme işlemini gerçekleştirebilirsiniz.

Ve nesne

class MetaObject { 
    public List<Integer> objects; 

    @JsonDeserialize(using = MetaDeserializer.class) 
    public String meta; 

    @Override 
    public String toString() { 
     return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}'; 
    } 
} 

Ve MetaObject result = mapper.readValue("...", MetaObject.class) çağırmak eğer sen

MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'} 
+1

belki sadece üzerinde ek açıklama ile yukarıda belirtilen 'JsonDeserializer' kullanmak daha kolay olurdu istediğini elde edecek 'String next' özelliği ve sadece 'nesneleri' olarak aynı kök düzeyinde, düz olduğu gibi davran? –

+0

@ap, Bu notu, sınıfın en üstünde bile, dokümantasyonda farklı şekilde kullanabilirsiniz. Https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind /annotation/JsonDeserialize.html – SerCe

+1

Gelecekteki herhangi bir soru için, yukarıdaki yanıtın yanlış görünüyor gibi '.asText()' yöntemini kullandığını belirtmeliyim. Etrafta çalıştıktan sonra '.textValue() 'yi kullanmaya başladım ve bir çekicilik gibi çalışıyor. –