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!
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. –
najwyższa wersja, którą mogę przejść to 1.8.5. Jakieś sugestie? Wypróbuję twój pomysł JsonSerializer na OddType. –
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