Jackson'da özel seri hale getirici ve deserializer nasıl yazılır?

Bir düzineden fazla özelliği olan bir sınıfım var. İlkel türün özelliklerinin çoğunda, varsayılan BeanSerializer ve BeanDeserializer'ı veya yazmam gereken hantal kodları azaltmak için ne kullanırsam kullanırım. Özel ve dizi türlerinin diğer özellikleri için, bazı özel serializer/deserializer yapmak istiyorum. Temel JSON dizesini değiştiremediğimi unutmayın. Ama ben android koduna tam erişimim var. Jackson 1.7.9/Ektorp 1.1.1 kullanıyorum.

BeanDeserializer alt sınıfını mı kullanmalıyım? Bununla sorun yaşıyorum. Parametresiz bir varsayılan kurucuyu bekler ama süper kurucuyu nasıl arayacağımı bilmiyorum.

class MyType{
   //a dozen properties with primitive types String, Int, BigDecimal
    public Stirng getName();
    public void setName(String name);

   //properties that require custom deserializer/serializer
    public CustomType getCustom();
    public void setCustom(CustomType ct);
}

class MyDeserializer extends BeanDeserialzer{
   //an exception is throw if I don't have default constructor.
   //But BeanDeserializer doesn't have a default constructor
   //It has the below constructor that I don't know how to fill in the parameters
    public MyDeserializer(AnnotatedClass forClass, JavaType type,
        BeanProperty property, CreatorContainer creators,
        BeanPropertyMap properties,
        Map backRefs,
        HashSet ignorableProps, boolean ignoreAllUnknown,
        SettableAnyProperty anySetter) {
    super(forClass, type, property, creators, properties, backRefs, ignorableProps,
            ignoreAllUnknown, anySetter);
}
    @Override
    public Object deserialize(JsonParser jp, DeserializationContext dc, Object bean)
        throws IOException, JsonProcessingException {
    super.deserialize(jp, dc, bean);
        MyType c = (MyType)bean;        

            ObjectMapper mapper = new ObjectMapper();

            JsonNode rootNode = mapper.readValue(jp, JsonNode.class);
           //Use tree model to construct custom
           //Is it inefficient because it needs a second pass to the JSON string to construct the tree?
            c.setCustom(custom);
            return c;
}
}

Google'da arama yaptım, ancak yararlı örnekleri/öğretici bulamadım. Herkes bana harika olabilecek bazı çalışma örnekleri gönderebilir! Teşekkürler!

7

1 cevap

BeanSerializer/-Deserializer alt sınıfına geçmek için, Jackson'ın daha yeni bir versiyonunu kullanmanız daha iyi olacaktır çünkü bu alan, örneklerin konfigürasyonunu değiştirebilen BeanSerializerModifier ve BeanDeserializerModifier ile açık destekle geliştirildi.

Ancak, emin olmak için, tek tek özelliklerde kullanılmak üzere özel seri hale getirici/desperizer de belirtebilirsiniz.

class Foo {
   @JsonSerialize(using=MySerializer.class)
   public OddType getValue();
}
4
katma
1.8, 1.7'den daha iyi üstesinden gelebilirliğe sahiptir, bu yüzden işe yarayabilir. BeanSerializerModifier'ı kullanarak BeanSerializer'ı geçersiz kılmanız gerekmez, ancak özel örnekler oluşturabilir, ancak diğer ayarlarınızı varsayılan ayarlara erteleyebilirsiniz. Ayrıca, özel serileştiricileriniz 'resol ()' yönteminde varsayılan değerlere bakabilir (BeanSerializer'ın yaptığı gibi ResolvableSerializer'ı uygularsanız). İdeal olarak sadece basitlik için alt sınıf BeanSerializer'lardan uzak durursunuz; ama alt sınıfa ihtiyacınız varsa, bu da desteklenen bir tekniktir.
katma yazar StaxMan, kaynak
Elle sarılmamış yapmak zor; ve Bean (De) SerializerModifier gerçekten gelişmiş bir kullanım durumudur. İyi şanslar!
katma yazar StaxMan, kaynak
Haklısın. Yazım hatası düzeltildi, teşekkürler!
katma yazar StaxMan, kaynak
Bu gibi görünüyor @JsonSerialize (sonunda hiçbir r).
katma yazar Frans, kaynak
Fikir için teşekkürler! Çalışıp çalışmadığını görmek için deneyeceğim. Android için Ektorp kullanıyorum ve 1.1.1'i önerdiler, bu yüzden bu yüzden Jackson 1.7.9 kullanıyorum. Ama yükseltirsem işe yarayabilir.
katma yazar PokerIncome.com, kaynak
gidebileceğim en yüksek sürüm 1.8.5. Herhangi bir öneri? OddType üzerinde JsonSerializer fikrini deneyeceğim.
katma yazar PokerIncome.com, kaynak
tekrar fikir için teşekkürler! Ben temelde 1.8.5 JsonUnwrapped (1.9 özellik) serialize/deserialize uygulamak istiyorum. Yapmanın en kolay yolu nedir? BeanSerializerModifier'ı nasıl kullanacağımı anlamakta zorlanıyorum. Herhangi bir örnek veya belgeniz var mı? Çok teşekkürler!
katma yazar PokerIncome.com, kaynak
Bu örneği kullanmaya gidiyorum ve JsonDeserializer öğesini, her özelliği kendim için serileştirecek şekilde genişletir. Yazmak zor görünüyor ama şimdi bildiğim tek yol bu! javasourcecode.org/html/open-source/jackson/jackson-1.8.5/or&zwnj g/& hellip;
katma yazar PokerIncome.com, kaynak