Jackson进行Json反序列化对于一个小写字母开头后跟大写字母无法识别反序列成功问题

问题描述

json数据:{“pTargetId”:“123”}
javaBean:

    @Datapublic static class Test {private String pTargetId;}

运行下面代码:

    public static void main(String[] args) throws JsonProcessingException {String json = "{\"pTargetId\":\"123\"}";ObjectMapper objectMapper=new ObjectMapper();Test test = objectMapper.readValue(json, Test.class);}

报错:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "pTargetId" 

这个报错的意思很明显,从json中没有解析出对象的pTargetId字段,但明显我们知道json中是存在这个属性字段的。

通过设置

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//可以将jackson设置为不需要json中包含javaBean中的属性字段。

在这里插入图片描述
这里报错倒是解决了,但是本质问题还是没有解决也就是为什么json中有pTargetId,但是转换成对象后属性值确实空的。

Gson,fastjson,hutool的不存在这个问题

导致原因

jackson在识别对象的属性name时,会通过两种方式,第一通过field的name,第二种通过javaBean规范获取getXxx()方法解析属性名。
它出问题的地方是方法二,通过getXxx()解析属性名。

源码位置

public class DefaultAccessorNamingStrategy extends AccessorNamingStrategy {/*** Method called to figure out name of the property, given corresponding suggested 			name based on a method or field name.* Params:* basename – Name of accessor/mutator method, not including prefix ("get"/"is"/"set")** 这个方法就是用来解析getXxx方法,basename:就是getXxx字符串 offset对于getXxx就是3,对于isXxx就是2* 下面的说明都针对 getPTargetId() 这个方法**/protected String legacyManglePropertyName(final String basename, final int offset){final int end = basename.length();if (end == offset) { // empty name, nopereturn null;}//获取方法的首字母 也就是P        char c = basename.charAt(offset);// 12-Oct-2020, tatu: Additional configurability; allow checking that//    base name is acceptable (currently just by checking first character)if (_baseNameValidator != null) {if (!_baseNameValidator.accept(c, basename, offset)) {return null;}}// next check: is the first character upper case? If not, return as is//将首字母变更为小写char d = Character.toLowerCase(c);//如果首字母是小写,直接返回get后的字符串 (getaaa() 返回的就是aaa)if (c == d) {return basename.substring(offset);}// otherwise, lower case initial chars. Common case first, just one charStringBuilder sb = new StringBuilder(end - offset);//将小写的首字母放到要输出的字符串中sb.append(d);//从首字母后的字母开始int i = offset+1;for (; i < end; ++i) {c = basename.charAt(i);d = Character.toLowerCase(c);//如果字母为小写,则将当前以及后面的字符全部加入到输出的字符串中if (c == d) {sb.append(basename, i, end);break;}//如果字母为大小,则调整为小写然后加入到字符串中sb.append(d);}/*** 针对于 getPTargetId()方法,则返回的字符串为 ptargetId*  pTargetId 属性字段,生成get方法的规范就是get后首字母大写*  所以其get方法为getPTargetId()**/return sb.toString();}}

那么上述方法在哪调用的呢?

public class POJOPropertiesCollector
{protected void collectAll(){LinkedHashMap<String, POJOPropertyBuilder> props = new LinkedHashMap<String, POJOPropertyBuilder>();// First: gather basic data//通过属性直接获取其名称_addFields(props); // note: populates _fieldRenameMappings//通过上面我们讲解的方法获取名(层级比较深)_addMethods(props);// 25-Jan-2016, tatu: Avoid introspecting (constructor-)creators for non-static//    inner classes, see [databind#1502]if (!_classDef.isNonStaticInnerClass()) {_addCreators(props);}// Remove ignored properties, first; this MUST precede annotation merging// since logic relies on knowing exactly which accessor has which annotation_removeUnwantedProperties(props);// and then remove unneeded accessors (wrt read-only, read-write)_removeUnwantedAccessor(props);.....忽略的代码}}

上面源码的思路是,最后我们会生成一个LinkedHashMap<String, POJOPropertyBuilder> props,其中key为名称,value为对应的属性构建对象。
什么意思呢,比如我们json数据{"pTargetId":"123"},那么最后只有在map中含有key:pTargetId的builider才能进行写入。

而这个map的生成可以通过_addFields(props)方法,去解析类的属性名称来进行获取到,也可以通过_addMethods(props),刚才说的通过解析getXxx()方法来获取到。

所以到这里我们的Test类的map应该有两个值,一个是通过属性解析出来的pTargetId和通过方法解析出来的ptargetId
在这里插入图片描述
那么虽然通过方法获取的key错误了(ptargetId),但不是还有通过属性正确获取的吗(pTargetId),为什么最后还是没赋值进去?这是因为下面这个方法:

        _removeUnwantedProperties(props);

这个方法将会把某些不合规的属性值给移除掉,针对于属性类型获取的key,如果你的属性范围为private,那么就会将你过滤掉(过滤逻辑比较简单,可以自己追下去看看)
在这里插入图片描述
所以最后只有错误的ptargetId存在。

解决方案

原因知道了,方案就很简单了,就是想办法将它的key变更对(非常不符合直觉,满足json规范,满足javaBean规范,最后却不能正确转成功,因该是Bug范畴了吧)

  1. 换工具,Gson,fastjson符合直觉,能填充成功(Gson这块代码非常清晰,思路符合直觉)
  2. private pTargetId修改为public pTargetId
  3. 自己实现get方法
        public String getpTargetId() {return pTargetId;}
  1. 使用@JsonProperty(value = "pTargetId")注解
    等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

We are a team - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 总共有 n 个人在机房&#xff0c;每个人有一个标号 (1<标号<n) &#xff0c;他们分成了多个团队&#xff0c;需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中&#xff0c;具体的: 消息构成为 a b …

智慧启航:机场管理系统的革新与飞机航天展馆的视觉盛宴

随着科技的飞速发展&#xff0c;我们的生活方式正在不断地被改变和提升。而在航空领域&#xff0c;这种变化则更加明显。从机场的智慧管理系统大屏&#xff0c;到飞机航天展馆的三维可视化&#xff0c;再到飞机涡轮发动机的3D模型&#xff0c;科技的力量正在带我们进入一个前所…

ArkUI按钮组件深入学习:通过点击按钮实现图片大小调整效果

文章目录 前言Button组件控制 Button 样式实现点击按钮改变图片大小文章总结技术回顾前言 在前面几节课中,我们已经学习了 ArkUI 提供的一些常见组件,通过一个小案例实现了 image text 和 text input 组件的使用。我们成功地让用户通过输入来改变图片的宽度,从而实现了一个…

bat命令清理Window应用注册表(Unity开发Window应用)

bat命令清理Window应用注册表&#xff08;Unity开发Window应用&#xff09; 介绍出现的问题方案一方案二方案二解决方案1. 首先使用【Win】【R】组合快捷键&#xff0c;快速打开运行命令框&#xff0c;在打开后面键入命令&#xff1a;【Regedit】2. 完后后按回车键&#xff08;…

【Unity美术】Unity工程师对3D模型需要达到的了解【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

探索微软Edge:使用方法和心得分享

学习目标&#xff1a; 了解微软Edge的基本功能和使用方法。掌握在微软Edge上进行浏览、搜索和书签管理的技巧。学习如何使用微软Edge进行隐私和安全管理。探索微软Edge的扩展和其他高级功能。 学习内容&#xff1a; 微软Edge的简介&#xff1a;了解微软Edge的起源、特点和与其…

需求:多笔流水的金额分配给多个订单,确保流水总金额和订单总金额一致

&#x1f4da;目录 需求业务解释解决代码效果 需求 按照一定规则将多笔流水的金额分配给多个订单&#xff0c;确保流水总金额和订单总金额一致。 业务解释 之前系统做了个功能&#xff0c;允许对订单进行录错退款&#xff0c;并且重新关联新的订单&#xff0c;审核通过完成后…

logback1.2.3版本中日志文件时间自定义

假如在logback配置文件中存在以下配置 <appender name"custom_log_file" class"ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePatter…

逻辑卷学习

磁盘分区的缺点 1.无法扩容 2.必须使用的空间 3.没有备份: 一、逻辑卷的定义 LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小…

PicGo+GitHub搭建免费图床

PicGoGitHub搭建免费图床 步骤 1: 安装 PicGo步骤 2:创建图床仓库步骤 3: 配置 GitHub Token步骤 4: 配置 PicGo步骤 5: 上传图片步骤 6: 访问图片 使用 GitHub 作为图床的优势在于免费、稳定且具有版本控制功能&#xff0c;特别适合个人博客、小型项目等。PicGo作为一个开源的…

Java注解之@Autowired,一文掌握@Autowired注解知识(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

JS作用域:全局作用域,函数作用域,块级作用域

JS作用域&#xff1a;全局作用域&#xff0c;函数作用域&#xff0c;块级作用域 背景作用域全局作用域函数作用域块级作用域通过调用栈分析块级作用域开发者工具查看作用域选项卡示例 背景 由于 JavaScript 存在变量提升这种特性&#xff0c;从而导致很多与直觉不符的代码&…

Spring的Bean你了解吗

Bean的配置 Spring容器支持XML(常用)和Properties两种格式的配置文件 Spring中XML配置文件的根元素是,中包含了多个子元素&#xff0c;每个子元素定义了一个Bean,并描述了该Bean如何装配到Spring容器中 元素包含了多个属性以及子元素&#xff0c;常用属性及子元素如下所示 i…

python可视化界面自动生成,python如何做可视化界面

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python gui可视化操作界面制作&#xff0c;python做出的炫酷的可视化&#xff0c;现在让我们一起来看看吧&#xff01; 目录 前言 一.环境配置 插件&#xff1a; 1.python 2.Chinese 3.Open In Default Browser 安装pyt…

方案:智能分析网关V4区域人数超员AI算法模型的应用场景介绍

视频AI智能分析技术已经深入到人类生活的各个角落&#xff0c;与社会发展的方方面面紧密相连。从日常生活中的各种场景&#xff0c;如人脸识别、车牌识别&#xff0c;到工业生产中的安全监控&#xff0c;如工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品…

MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces(UNDO表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces&#xff08;UNDO表空间&#xff09;Undo Tablespaces&#xff08;UNDO表空间&#xff09;默认UNDO表空间添加 Undo 表空间查看Undo 相关的信息查看Undo 相关参数变量查看Undo 状态信息通过information_schema.innodb_…

python使用watchdog监听文件变化并打包成docker镜像

文章目录 简介1.监听文件的代码2.获取依赖列表文件3.创建Dockerfile文件4.上传文件到服务器上5.构建容器并启动6.更新main.py代码操作 简介 最近用python帮公司写了一个监控目录下文件发生变化的插件&#xff0c;在打包成docker镜像的过程中出现了一些小问题&#xff0c;特意记…

Unity中Shader裁剪空间推导(透视相机到裁剪空间的转化矩阵)

文章目录 前言一、简单看一下 观察空间—>裁剪空间—>屏幕空间 的转化1、观察空间&#xff08;右手坐标系、透视相机&#xff09;2、裁剪空间&#xff08;左手坐标系、且转化为了齐次坐标&#xff09;3、屏幕空间&#xff08;把裁剪坐标归一化设置&#xff09;4、从观察空…

基于YOLOv8的遥感SAR舰船小目标识别

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的遥感SAR舰船小目标&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…

【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南

欢迎来到人工智能的迷人世界&#xff0c;在那里&#xff0c;人与机器之间的通信越来越模糊。在这篇博客文章中&#xff0c;我们将探索人工智能驱动交互的一个令人兴奋的新前沿&#xff1a;与您的文本文档聊天&#xff01;借助OpenAI模型和创新的LangChain框架的强大组合&#x…