我需要编写一个方法,它接受一些对象,一些字段名称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 – 使用类字段中指定的自定义反序列化器反序列化字符串...相关推荐

  1. java arrays方法_Java工具类Arrays中不得不知的常用方法

    原标题:Java工具类Arrays中不得不知的常用方法 Arrays 数组操作集数组转List ---asList 这个被"普遍"称为数组转List的方法,可能是Arrays内大家 ...

  2. java输出文件中匹配的字段_Java如何从文件中打印与给定模式匹配的所有字符串?...

    在Java编程中,如何从文件中打印与给定模式匹配的所有字符串? 以下示例显示了如何使用Util.regex类的Patternname.matcher()方法从文件中打印与给定模式匹配的所有字符串. p ...

  3. java 枚举 注解_Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  4. java tomcat 404配置_在Tomcat中配置404自定义错误页面详解

    一直使用tomcat,今天想到一个问题,自定义404错误页面, 为了获得很好的用户感受,是不应当向用户暴露404这样的页面的, 问题的出发点是我在Struts2中定义错误页面, 在Struts2中是这 ...

  5. java file 工具_JAVA文件类工具

    FileUtil package cn.jiangzeyin.util.file; import org.springframework.util.Assert; import java.io.*; ...

  6. java inputstream子类_Java InputStream 类

    Java InputStream 类 在本教程中,我们将通过一个示例来学习Java InputStream类及其方法. java.io包的InputStream类是一个抽象超类,它表示字节的输入流. ...

  7. java printwriter实例_Java PrintWriter 类

    Java PrintWriter 类 在本教程中,我们将通过示例来学习Java PrintWriter及其print()和printf()方法. java.io包的PrintWriter类可用于以通常 ...

  8. java filewriter 编码_Java FileWriter 类

    Java FileWriter 类 在本教程中,我们将借助示例学习Java FileWriter及其方法. java.io包的FileWriter类可用于将数据(以字符为单位)写入文件. 它继承了Ou ...

  9. java返回特定下标元素_java基础--输出数组中指定元素的下标

    java基础--输出数组中指定元素的下标 java基础--输出数组中指定元素的下标 package com.lcn.day05; public class ArrayDemo8 { /** * 输出数 ...

最新文章

  1. Linux之nfs服务
  2. PAT_B_1002_Java(20分)
  3. 一个关于WCF调用远程链接返回405错误不允许使用此方法的问题
  4. redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案
  5. python音乐下载器交互界面_基于Python实现下载网易音乐代码实例
  6. linux 双网卡 debian,Debian 双网卡bond
  7. 【转】Git详解之四 服务器上的Git
  8. SpringSecurity实现记住我功能
  9. 【数据结构笔记36】C实现:基于Median3的快速排序
  10. Web安全之SQL注入攻击技巧与防范
  11. python模拟足球比赛_博客园仿真足球竞赛平台Python版SDK
  12. 一文讲清前端应该理解的分辨率/逻辑分辨率/物理分辨率
  13. 渗透测试流程 - 渗透测试的9个步骤
  14. 用netty实现zcool_Netty 系列一(核心组件和实例).
  15. linux最大的账户,Linux系统账户安全
  16. ubuntu设置时间为utc标准时间
  17. win10命令行模式无法切换输入法
  18. python爬虫获取天猫店铺信息(更新到2020年)
  19. 多媒体的一些基本概念
  20. C# 邮件发送帮助类

热门文章

  1. 走进异步世界:博客程序的异步化改造以及发布后的不理想情况
  2. MapReduce入门
  3. linux下删除文件名乱码文件
  4. dos命令行输入adb shell命令为什么报错
  5. 畅谈程序人生暨孙鑫老师与读者交流会
  6. 用putty中的pscp命令拷贝文件
  7. MFC自动注册ODBC数据源
  8. Python用起来极度舒适的强大背后
  9. iOS iCloud云存储数据
  10. matlab中特殊符号如希腊字符