简单的说:

对于java bean中有字段类似pId这种写法,特征是第一个字母小写,第二个字母大写,在eclipse中生成的getter setter方法是 getpId, setpId。

在低版本的fastjson,比如1.1.41中将java bean序列化成json字符串的时候,会丢掉pId这个字段。 使用高版本,比如1.2.46,就不会有这个问题。

那么,这到底是谁的锅?

先说结论,fastjson的锅。

先说,eclipse生成的对不对?生成的是对的,参见这里

This is not the problem of eclipse it is the logic of getter and setter.

再说eclipse为什么要这么生成?因为符合java bean规范

简单地说,getter setter方法是读取java bean字段的入口。 如果生成的是getPId和setPId,通过getter setter 方法拿到的属性字段名将是PId,不会是pId。为了能通过getter setter方法拿到的字段是pId,所以倒推出getter setter方法应该是getpId和setpId,参见这里

So when you have the introspection of a class that contains Long getRPersonId() and setRPersonId(Long), a property can be extracted from it. The name of the property generally follows from lower-casing the first letter, and keeping the rest unchanged. But this is not always the case, the exact rule is in paragraph 8.8:

在高版本的fastjson中,不论写的是getpId还是getPId都不会丢字段。

fastjson在1.1.41版本中有问题的获取代码如下:

  1. if (Character.isUpperCase(c3)) {
  2. if (compatibleWithJavaBean) {
  3. propertyName = Introspector.decapitalize(methodName.substring(3));
  4. } else {
  5. propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
  6. }
  7. } else if (c3 == '_') {
  8. propertyName = methodName.substring(4);
  9. } else if (c3 == 'f') {
  10. propertyName = methodName.substring(3);
  11. } else {
  12. continue;
  13. }

fastjson在1.1.42版本中已经修复。

1.1.42的com.alibaba.fastjson.util.TypeUtils.computeGetters(Class<?>, Map<String, String>, boolean)

  1. if (Character.isUpperCase(c3)) {
  2. if (compatibleWithJavaBean) {
  3. propertyName = decapitalize(methodName.substring(3));
  4. } else {
  5. propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
  6. }
  7. } else if (c3 == '_') {
  8. propertyName = methodName.substring(4);
  9. } else if (c3 == 'f') {
  10. propertyName = methodName.substring(3);
  11. } else if (methodName.length()>=5 && Character.isUpperCase(methodName.charAt(4))){
  12. propertyName = decapitalize(methodName.substring(3));
  13. }

fastjson在1.2.46实现如下:

com.alibaba.fastjson.util.TypeUtils.buildBeanInfo(Class<?>, Map<String, String>, PropertyNamingStrategy, boolean)

  1. List<FieldInfo> fieldInfoList = fieldBased
  2. ? computeGettersWithFieldBase(beanType, aliasMap, false, propertyNamingStrategy) //
  3. : computeGetters(beanType, jsonType, aliasMap, fieldCacheMap, false, propertyNamingStrategy);

已经有基于field还是基于getter setter来解析了。

fastjosn在低版本丢字段问题的更多相关文章

  1. [杂] 将高版本iTunes备份恢复到低版本iOS设备中

    除非开发测试用设备,自用设备不要随便升iOS beta,不要随便升iOS beta,不要随便升iOS beta. 对于升级了高版本iOS的用户,默认情况下重刷低版本iOS时,iTunes不允许向低版本 ...

  2. 如何让VMware低版本运行VMware高版本创建的虚拟机

    如何让VMware低版本运行VMware高版本创建的虚拟机 问题描述: 本机安装的VMware Workstation是10版本,之前VMware Workstation 11版本创建的虚拟机,在运行 ...

  3. IE低版本下实现html5的placeholder(表单提示)功能

    placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 注释:placeholder 属性适用于以下的 <inpu ...

  4. 低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode

        之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar.但是在最新的SDK中Google提供了一个AppCompa ...

  5. WebSocket兼容到低版本浏览器

    就目前而言,WebSocket是最好的Web通信解决方案了.但是IE从10才开始兼容它,对于目前大量IE8存在的市场,原生的WebSocket显然不太实用,我们需要低版本兼容的解决方案.于是我模拟We ...

  6. mysql 低版本导入表中包含两个TIMESTAMP报错问题

    错误代码: 1293  Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAM ...

  7. xcode低版本调试高版本真机系统

    低版本xcode调试本真机高版本系统 //打开此路径把最新的文件拷贝到这里就可以了 /Applications/Xcode.app/Contents/Developer/Platforms/iPhon ...

  8. 低版本GCC程序向高版本移植的兼容性问题

    将低版本gcc编译过的程序移植到高版本GCC时, 可能会出现一些兼容性问题. 原因是, 为了适应新的标准,一些旧的语法规则被废弃了. 关于这方面的一些具体资料可从该处查询. 这里只是自己遇到的其中一个 ...

  9. android中导入低版本project可能会遇到的编译问题(转自: Victor@Beijing)

    使用高版本的SDK后再导入以前用低版本的project时,会遇到一些兼容性的问题. (1)Unable to resolve target 'android-5' 因为本机中现在使用的是2.2的SDK ...

随机推荐

  1. SpringBoot的特性

    SpringBoot的理念“习惯优于配置” 习惯优于配置(项目中存在大量的配置,此外还内置了一个习惯性的配置,无须手动进行配置) 使用SpringBoot可以方便地创建独立运行.准生产级别的基于Spr ...

  2. linux设置history历史记录

    #说明export HISTSIZE=1000 #设置历史记录显示1000行export HISTTIMEFORMAT='%F %T ' #设置历史记录格式 999 2017-08-15 10:58: ...

  3. 【Quartus警告】created implicit net for XXX.

    [警告内容]Warning (10236): Verilog HDL Implicit Net warning at forward_replace.v(16): created implicit n ...

  4. python3应用例子01(进度条)

    #!/usr/bin/env python# -*- coding:utf-8 -*- import sysimport time def bar(num, total): rate = num / ...

  5. sk-learning(2)

    sk-learning 学习(2) sklearing 训练评估 针对kdd99数据集使用逻辑回归分类训练 然后进行评估 发觉分数有点高的离谱 取出10%数据494021条,并从中选择四分之一作为测试 ...

  6. IIS7.5配置自动添加www 及 限制通过IP访问web

    IIS7.5配置自动添加www 方法 新建一个站点2(主机名为不带www的站点),将其重定向至带www的URL即可. 注意以下几点 站点2不可与站点1的路径一致,否则会导致站点1也会添加同样的重定向, ...

  7. IOS 长按+轻扫(手势识别)

    @interface NJViewController () @property (weak, nonatomic) IBOutlet UIView *customView; @end @implem ...

  8. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  9. BZOJ 3878: [Ahoi2014]奇怪的计算器

    BZOJ 3878: [Ahoi2014]奇怪的计算器 标签(空格分隔): OI-BZOJ OI-线段树 Time Limit: 10 Sec Memory Limit: 256 MB Descrip ...

  10. STM32启动流程

    启动文件主要工作: . 设置堆栈指针SP=_initial_sp . 设置PC指针=Reset_Handler . 配置系统时钟 . 配置外部SRAM用于程序变量等数据存储(可选) . 调用C库中的_ ...