【发布时间】:2019-02-24 22:47:42
【问题描述】:
我需要编写一个方法来获取一些对象、给定对象的类中存在的一些字段名称fieldName,以及一些字段值value。该值是字段的 JSON 序列化形式。该方法应获取该值并相应地对其进行反序列化,如下所示:
static void setField(Object obj, String fieldName, String value) throws Exception {
Field field = obj.getClass().getDeclaredField(fieldName)
Object valObj = objectMapper.readValue(value, field.getType());
field.set(obj, valObj);
}
(我实际上只需要检索反序列化的值,而不是再次设置它,但这使它成为一个更好的例子。) 只要杰克逊的默认反序列化足够,就可以了。现在假设我有一个带有自定义(反)序列化器的类:
class SomeDTO {
String foo;
@JsonSerialize(using = CustomInstantSerializer.class)
@JsonDeserialize(using = CustomInstantDeserializer.class)
Instant bar;
}
一种可能的解决方案是手动检查JsonDeserialize 注释。但是,我真的不想尝试复制 Jackson 遵循的任何策略来决定使用什么序列化程序,因为这看起来很脆弱(例如全局注册的序列化程序)。
有没有使用 DTO 类中定义的字段的反序列化配置来反序列化值的好方法?也许在将字段的注释传递给 Jackson 的同时将值反序列化为字段的类型,以便他们得到尊重?
我设法获得了一个 AnnotatedMember 实例,该实例包含所有必需的信息(JSON 注释和反射字段或 setter/getter 访问),但不知道如何使用它由于缺乏文档而反序列化独立值:
final JavaType dtoType = objectMapper.getTypeFactory().constructType(SomeDTO.class);
final BeanDescription description = objectMapper.getDeserializationConfig().introspect(dtoType);
for (BeanPropertyDefinition propDef: beanDescription.findProperties()) {
final AnnotatedMember mutator = propertyDefinition.getNonConstructorMutator();
// now what? Also: How do I filter for the correct property?
}
【问题讨论】:
-
你能提供你想要达到的目标的示例 JSON 输出吗?没有输出部分似乎有点复杂理解
标签: java serialization jackson