今天帮助同事调试一个问题,说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,进行封装
自定义注解可以用来标记那些大小写不敏感的属性,然后在反序列化过程中特别处理这些属性。 总结一下,这个知识点主要涵盖了以下内容: 1. JSON规范的大小写敏感性。 2. Java中处理JSON的常见库——Gson和Jackson。 ...
在Spring Boot应用中,我们经常使用Redis作为缓存或消息队列来提升应用程序的性能。...通过这样的配置,我们可以方便地存储和检索自定义类型的对象,如`Student`,在Redis中,而无需关心底层的序列化细节。
在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合Fastjson配置Redis序列化,确保数据正确存储和读取。 首先,我们需要在`pom.xml`中添加必要的依赖。Spring Boot的`spring-boot-starter-cache`模块...
fastjson和jackson序列化数据的区别直奔主题一言不合就上代码注意 直奔主题 1、fastjson将字符串反序列化为对象时,只会处理第一层,内部会序列化为JsonObject或者JsonArray,使用二级结构和三级结构时还要再次处理...
- Gson提供了丰富的API,如`GsonBuilder`,允许开发者定制序列化过程,比如忽略某些字段,或者设置日期格式等。 在实际应用中,选择哪个库主要取决于项目需求。如果需要与protobuf兼容,或者追求极致的性能和内存...
**Fastjson 1.2.69 反序列化远程代码执行漏洞详解** Fastjson 是阿里巴巴开源的一个高性能的 JSON 库,广泛应用于 Java 开发中,用于 JSON 的序列化和反序列化操作。然而,Fastjson 1.2.69 版本存在一个严重的反序...
在这个例子中,我们关注的是 Fastjson 的序列化(Serialization)和反序列化(Deserialization)过程,特别是涉及到 `JSON.parseObject` 和 `JSON.parse` 方法。 1. **序列化(Serialization)**:序列化是将 Java ...
这些库提供了JSON的序列化和反序列化功能,将Java对象转换为JSON字符串,以及将JSON字符串转换回Java对象。 1. **Fastjson**:Fastjson是阿里巴巴开源的一个高性能的JSON库,它的设计目标是处理速度极快,API简洁...
阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...
astjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过...
在Spring MVC中,Fastjson是一个常用的JSON库,用于序列化和反序列化Java对象。当我们在处理日期时间字段时,可能会遇到反序列化时日期格式不一致的问题,导致默认显示为时间戳。本文将详细介绍两种解决Spring MVC中...
fastJSON 是一个开源的 JSON 序列化组件,可以用于 C# 中对 JSON 数据的序列化和反序列化。它的主要特点是速度快、易于使用,并且支持多种数据类型。 fastJSON 的优点 fastJSON 的优点包括: * 快速序列化和反...
**Fastjson 1.2.24 反序列化远程代码执行漏洞详解** 在Java开发中,Fastjson是一个广泛使用的高性能JSON库,它提供了一种快速解析和生成JSON的机制。然而,像许多处理序列化和反序列化的库一样,Fastjson在某些版本...
在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...
FastJSON 序列化一个 JSON 库涉及的最基本功能就是序列化和反序列化。FastJSON 支持 JavaBean 的直接序列化。你可以使用 com.alibaba.fastjson.JSON 这个类进行序列化和反序列化。基本序列化序列化就是把 JavaBean ...
JSON(Java Script Object ...重点说明了工具类fastjson 是怎么实现 JSON 的序列化和反序列化的。 首先你要确保在项目中已经添加了Fastjson的依赖包,否则需要手动添加。如果是Maven项目,可以在pom.xml中添加依赖;
FastJson 是阿里巴巴开发的一款高效的 JSON 序列化与反序列化库,它广泛应用于 Java 开发中。在处理 HTTP 消息转换时,FastJson 提供了 FastJsonHttpMessageConverter 类,该类允许开发者自定义 JSON 序列化和反序列...
Fastjson的序列化过程是指将Java对象转换成JSON字符串,这对于将复杂的数据结构通过网络传输或者存储到文件中非常有用。例如,如果你有一个Java Bean对象,Fastjson可以将其属性及其值转化为JSON格式,使得数据易于...
在Java世界里,为了方便地进行JSON的序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象),有多个库提供了强大的支持,其中包括Gson、Jackson、Fastjson以及LoganSquare。接下来,我们将...