Ayrıca, ContextualDeserializer
uygulayan genel türünüz için özel bir JsonDeserializer
uygulayabilirsiniz.
public static class Wrapper<T> {
public T value;
}
Şimdi şöyle JSON serisini istiyorum: örneğine içine
{
"name": "Alice",
"age": 37
}
Örneğin, genel bir değeri içeren aşağıdaki basit sarıcı türü olduğunu varsayalım şunun gibi bir sınıf:
public static class Person {
public Wrapper<String> name;
public Wrapper<Integer> age;
}
Uygulanması ContextualDeserializer
Person
sınıfındaki her alan için, alanın jenerik tip parametrelerini temel alan spesifik bir desterizer oluşturmamızı sağlar. Bu, adı bir dizge olarak ve dizinin bir tamsayı olarak serileştirilmesini sağlar.
tam deserializer şuna benzer: Bu Jackson tarafından ilk çağrılacak olarak
public static class WrapperDeserializer extends JsonDeserializer<Wrapper<?>> implements ContextualDeserializer {
private JavaType valueType;
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
JavaType wrapperType = property.getType();
JavaType valueType = wrapperType.containedType(0);
WrapperDeserializer deserializer = new WrapperDeserializer();
deserializer.valueType = valueType;
return deserializer;
}
@Override
public Wrapper<?> deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
Wrapper<?> wrapper = new Wrapper<>();
wrapper.value = ctxt.readValue(parser, valueType);
return wrapper;
}
}
O burada ilk createContextual
bakmak en iyisidir. Alanın türünü BeanProperty
(ör. Wrapper<String>
) dışında okuyoruz ve sonra ilk jenerik tip parametresini (ör. String
) ayıklıyoruz. Daha sonra yeni bir desperizatör oluştururuz ve iç tipini valueType
olarak saklarız. deserialize
kez
bu yeni oluşturulan deserializer üzerine denir, biz sadece ziyade bütün sarıcı türü olarak daha iç türü olarak değerini serisini Jackson sormak ve Serileştirilmemiş değerini içeren yeni Wrapper
döndürebilir.O zaman yukarıdan örnek JSON serisini denerseniz
SimpleModule module = new SimpleModule()
.addDeserializer(Wrapper.class, new WrapperDeserializer());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
görebiliriz: Bu özel deserializer kayıt için
, biz o zaman bu modülü bunu içeren bir modül oluşturmak gerekir ve kayıt o beklendiği gibi çalıştığını:
deserializers
Jackson documentation nasıl çalıştığı içeriksel hakkında biraz daha detay bulunmaktadır
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person.name.value); // prints Alice
System.out.println(person.age.value); // prints 37
.
Sen * ilan öğrenmek için yansıma kullanabilirsiniz * foo'nun türü Foo 'dur. Bu konuda. Jackson'ın bunun burada sizin için bir araç olup olmadığını söyleyeceğini bilmiyorum. ['Alan # getGenericType'] (http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getGenericType--) –
Radiodef