今天帮助同事调试一个问题,说fastjson在序列化的时候是忽略大小写的,有测试代码,但是不知道为什么,我帮他看了下,特意将过程记录在这个地方。
Bean定义如下:
public class Person{ private int id; private String name; public int getId(){return id;} public void setId(int id){this.id = id;} public String getName(){return name;} public void setName(String name){this.name = name;}
JSON转换的代码如下:
String text = "{\"id\":123,\"NAME\":\"chris\"}";
Person bean = JSON.parseObject(text, Person.class);
System.out.println(JSON.toJSONString(bean));
这个属性是能赋值成功的,看到json里面的key是NAME,而bean的属性是name,可以赋值成功。
我在解决问题的时候,发现既然能赋值成功,我们可以在setName上面加一个断点,就可以看到整个调用栈了,最后发现在ASMJavaBeanDeserializer类里面有下面的逻辑使得它可以忽略大小写查找。
public boolean parseField(DefaultJSONParser parser, String key, Object object, Type objectType, Map<String, Object> fieldValues) { JSONScanner lexer = (JSONScanner) parser.getLexer(); // xxx Map<String, FieldDeserializer> feildDeserializerMap = serializer.getFieldDeserializerMap(); FieldDeserializer fieldDeserializer = feildDeserializerMap.get(key); if (fieldDeserializer == null) { for (Map.Entry<String, FieldDeserializer> entry : feildDeserializerMap.entrySet()) { if (entry.getKey().equalsIgnoreCase(key)) { fieldDeserializer = entry.getValue(); break; } } } if (fieldDeserializer == null) { if (!parser.isEnabled(Feature.IgnoreNotMatch)) { throw new JSONException("setter not found, class " + serializer.getClass() + ", property " + key); } lexer.nextTokenWithColon(); parser.parse(); // skip return false; } lexer.nextTokenWithColon(fieldDeserializer.getFastMatchToken()); fieldDeserializer.parseField(parser, object, objectType, fieldValues); return true; }
可以发现,在从map中获取到fieldDeserializer为空的时候,还在进行一次忽略大小写的比较,既可以拿到值。
这个地方,在调试的时候,发现这个map类型为IdentityHashMap,关于这个的用法和源码,请参考我的另外一个博客
相关推荐
[{"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],"test":"432"}, {"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],...数组里面封装数组的反序列化方法,通过两个bean,进行封装
主要介绍了SpringBoot Redis配置Fastjson进行序列化和反序列化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
fastjson和jackson序列化数据的区别直奔主题一言不合就上代码注意 直奔主题 1、fastjson将字符串反序列化为对象时,只会处理第一层,内部会序列化为JsonObject或者JsonArray,使用二级结构和三级结构时还要再次处理...
阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...
fastjson、gson、jackson序列化和反序列化所用json文件
下面小编就为大家带来一篇springmvc fastjson 反序列化时间格式化方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
fastjson1.2.69反序列化远程代码执行漏洞介绍fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令...
protostuff fastjson gson 高性能序列化jar包
astjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过...
JSON.parseObject 和 JSON.parse 这两个方法差不多, JSON.parseObject 的底层调用的还是在序列化时, FastJson
Gson jackson fastjson LoganSquare 使用demo Gson jackson fastjson LoganSquare 使用demo
FastJson是阿里巴巴工程师开发的一个json处理工具包,包括“序列化”和“反序列化”两部分。支持Java Bean、集合、Map、日期等等。我这是用fastjson解析json串一个简单的案例。
“本工具仅能在取得足够合法授权的企业安全建设中使用,在使用本工具过程中,您应确保自己所有行为符合当地的法律法规。 如您在使用本工具的过程中存在任何非法行为,您将自行承担所有后果,本工具所有开发者和所有...
FastjsonScan一个简单的Fastjson反序列化检测burp插件我在挖洞的时候看到一些json请求总是想要检测一下有没有Fastjson反序列化问题,本可以直接写一个脚本来跑或者搭配其他被动扫描器来验证,但是我太懒了,先不说...
各种序列化工具类,包括Gson, Jackson, FastJson, ProtoBuf以及proto.exe,希望大家喜欢
和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用...
fastjson-1.2.83.jar下载,fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也支持从JSON字符串反序列化到JavaBean。fastjson采用全新的JSON解析算法,运行速度极快...
支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。侵删 因为在GitHub网站上加载的速度太慢了,先放到这里。
springboot 使用fastjson自定义序列化和反序列化
fastjson用户序列化,反序列化json对象