2011-10-27 13 views
7

Mam klasę, która ma więcej niż tuzin nieruchomości. Dla większości właściwości typu pierwotnego, mam nadzieję użyć domyślnego BeanSerializer i BeanDeserializer lub cokolwiek innego, aby zmniejszyć kłopotliwy kod, który muszę napisać. W przypadku innych właściwości niestandardowych i typów tablicowych chcę wykonać niestandardowy serializer/deserializer. Zauważ, że nie jestem w stanie zmienić podstawowego ciągu JSON. Ale mam pełny dostęp do kodu Androida. Używam Jackson 1.7.9/Ektorp 1.1.1.Jak napisać niestandardowy serializator i deserializer w Jackson?

Czy mam podklasę BeanDeserializer? Mam z tym kłopot. Oczekuje domyślnego konstruktora bez parametrów, ale nie wiem, jak wywołać super konstruktora.

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<String, SettableBeanProperty> backRefs, 
     HashSet<String> 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; 
} 
} 

Przeszukałem Google, ale nie znalazłem żadnych pomocnych przykładów/samouczek. Jeśli ktoś może przesłać mi kilka przykładów, które byłyby świetne! Dzięki!

Odpowiedz

4

Do podkategorii BeanSerializer/-Deserializer, lepiej byłoby użyć nowszej wersji Jackson, ponieważ obszar ten został ulepszony dzięki jawnej pomocy poprzez BeanSerializerModifier i BeanDeserializerModifier, co może zmienić konfigurację instancji.

Ale tylko upewnić się, można także określić niestandardowy serializer/Deserializator po prostu być stosowane w zależności od indywidualnych właściwości, tak jak poniżej:

class Foo { 
    @JsonSerialize(using=MySerializer.class) 
    public OddType getValue(); 
} 
+0

Dzięki za pomysł! Spróbuję go sprawdzić, czy to działa. Używam Ektorp na Androida i sugerują 1.1.1, dlatego używam Jackson 1.7.9. Ale może to zadziałać, jeśli dokonam aktualizacji. –

+0

najwyższa wersja, którą mogę przejść to 1.8.5. Jakieś sugestie? Wypróbuję twój pomysł JsonSerializer na OddType. –

+0

1.8 ma lepszą przestarzałość niż 1.7, więc może faktycznie działać. Korzystając z BeanSerializerModifier, nie musisz przesłonić BeanSerializer, ale możesz również tworzyć niestandardowe instancje, ale odroczyć inne rekwizyty do ustawień domyślnych. Ponadto niestandardowe serializery mogą wyszukiwać domyślne w metodzie "resolve()" (jeśli implementujesz ResolvableSerializer, podobnie jak w BeanSerializer). Najlepiej byłoby, jeśli to możliwe, unikać podklasy BeanSerializers, tylko dla prostoty; ale jeśli potrzebujesz podklasy, jest to również obsługiwana technika. – StaxMan

Powiązane problemy