java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...
我需要编写一个方法,它接受一些对象,一些字段名称fieldName存在于给定对象的类中,以及一些字段值.该值是字段的
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);
}
(我实际上只需要检索反序列化的值,而不是再次设置它,但这使它成为一个更好的例子.)
只要杰克逊的默认反序列化就足够了,这就有效.现在让我们假设我有一个带有自定义(de)序列化器的类:
class SomeDTO {
String foo;
@JsonSerialize(using = CustomInstantSerializer.class)
@JsonDeserialize(using = CustomInstantDeserializer.class)
Instant bar;
}
一种可能的解决方案是手动检查JsonDeserialize注释.但是,我真的不想尝试复制Jackson遵循的任何策略来决定使用什么序列化程序,因为它看起来很脆弱(例如全局注册的序列化程序).
是否有一种使用DTO类中定义的字段反序列化配置来反序列化值的好方法?也许在将字段的注释传递给杰克逊时将值反序列化为字段类型,这样他们就会受到尊重?
我设法得到一个AnnotatedMember实例,它包含所有必需的信息(JSON注释和反射字段或setter / getter-access),但无法弄清楚如何使用它来反序列化一个独立的值到期缺乏文件:
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?
}
最佳答案 一种可能性是序列化对象,替换给定的字段,然后再次反序列化.从/向JsonNode而不是JSON-String序列化时可以轻松完成此操作,如下所示:
static Object setField(Object obj, String fieldName, String value) throws Exception {
// note: produces a new object instead of modifying the existing one
JsonNode node = objectMapper.valueToTree(obj);
((ObjectNode) node).put(fieldName, value);
return objectMapper.readValue(node.traverse(), obj.getClass());
}
但是,为了反序列化单个字段而序列化和反序列化整个对象似乎需要很多开销,并且可能很脆弱,因为DTO类的其他方面会影响单个字段的反序列化过程
总结
以上是生活随笔为你收集整理的java 自定义反序列化_java – 使用类字段中指定的自定义反序列化器反序列化字符串...的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: java处理json回车_json中换行
- 下一篇: java如何解决高并发问题_java怎么