2013-01-16 41 views
7

JSON'a serileştirirken bir nesneye yeni özellik eklemem gerekiyor. Özelliğin değeri çalışma zamanında hesaplanır ve nesnede mevcut değildir. Aynı nesne farklı JSON'ların farklı alt alanlar ile oluşturulmasında da kullanılabilir (alt sınıflara sahip bir taban sınıfına sahip olmakla birlikte, sadece JSON üretimi için olanları oluşturmak istemiyorum).Jackson :: serileştirme işleminde bir nesneye fazladan alan ekleme

Bunu gerçekleştirmenin en iyi yolu, tüm nesne kümelerinin serileştirilmesiyle ilgilenecek özel seri hale getirici sınıfının oluşturulmasını içermeyen nedir? Ya da bazı "temel" serileştiricilerin mirasını almak mümkün olabilir ve basitçe onun çıktısını alıp yeni alan ekleyebilir miyiz?

mixins hakkında bilgi aldım ve bazı alanları yeniden adlandırmak/gizlemek mümkün gibi görünüyor, ancak fazladan bir tane eklemek mümkün görünmüyor.

cevap

8

Değer sınıfında bir yöntem ekleyemez misiniz? Yaygın olması veya getter adlandırma kuralı kullanılmasının gerekmediğini unutmayın;

JsonNode tree = mapper.valueToTree(value); 

ve sonra

+0

Bu için bir iş gibi geliyor aynı nesnenin farklı alanlarını yazma gelince. Örneğin. Bir nesnenin URL'si… Nesnenin kendi adresi olduğunu bilmek değil, daha yüksek bir katman işi. – cdeszaq

+0

Çok ama neden aynı JSON Nesnesinde dizileniyor? Bu JSON yükü için potansiyel olarak kötü tasarım gibi geliyor. Her ne kadar JSON verilmiş olsa da, veriler arasında basit bir bölünme olmaması sorunu vardır, meta veriler (bir kişi adlandırma kuralıyla gelebilir) – StaxMan

+0

Dahili nesne gösterimi, dış kaynak gösterimi ile aynı değildir (üstbilgileri kabul etmelerine bağlı olarak değişmesi gerekebilir) . Bir kaynağın yaşadığı URL veya adres değişebilir ve iç nesnenin sorumluluğunda değil, yolların veya başka bir üst katmanın sorumluluğunda değildir. – cdeszaq

1

Bir seçenek bir alan eklemek için ekleme özellikleri vb bunu değiştirin: JSON Ağacı değerine POJO dönüştürebilirsiniz Aksi

public class MyStuff { 
    // ... the usual fields, getters and/or setters 

    @JsonProperty("sum") // or whatever name you need in JSON 
    private int calculateSumForJSON() { 
     return 42; // calculate somehow 
    } 
} 

: gibi bir şey yapabileceğini Bu özellik için ve JSON'a yazmadan önce nesneye koyun. JSON yazılırken bu gaz giderici

public String getFullName() { 
    return getFirstName() + " " + getLastName(); 
} 

Ve eşleşen alan var olsa bile Jackson otomatik arayacak: İkinci bir seçenek, emlak, diğer nesne özelliklerinden hesaplanabilir Eğer sadece örneğin bunun için bir alıcı ekleyebilir ve JSON çıktısında fullName olarak görünecektir. üçüncü bir seçenek çalışmaz ise bir haritaya nesneyi dönüştürmek ve sonra ihtiyaç ancak manipüle etmektir:

ObjectMapper mapper //..... 
MyObject o //..... 
long specialValue //..... 
Map<String, Object> map = mapper.convertValue(o, new TypeReference<Map<String, Object>>() { }); 
map.put("specialValue", specialValue); 

Sen soru unmarshalling söz etmedi ama siz de bunu yapmak gerekirse o zaman ilk seçenek iyi çalışırdı, ancak ikinci ikisinin biraz ayarlanması gerekiyordu.

Ve

ekstra alan sorumluluğunu tefrika edildikten nesnenin parçası değilse çalışmaz @JsonView

+0

"Haritaya dönüştür" nesnesi, Tamam gibi görünebilir, ancak biraz rahatsız edici görünüyor. Ekstra alanın serileştirilmiş olan nesnenin bir parçası olmaması durumunda "alan ekle" seçeneği çalışmaz. Örneğin. Bir nesnenin URL'si… Nesnenin kendi adresi olduğunu bilmek değil, daha yüksek bir katman işi. – cdeszaq

İlgili konular