`

FastJson序列化的时候忽略大小写的细节研究

阅读更多

        今天帮助同事调试一个问题,说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,关于这个的用法和源码,请参考我的另外一个博客

          http://asialee.iteye.com/blog/743443

   

分享到:
评论

相关推荐

    FastJson反序列化

    [{"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],"test":"432"}, {"listA":[{"id":"fds","name":"张三"},{"id":"fds","name":"李四"}],...数组里面封装数组的反序列化方法,通过两个bean,进行封装

    SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    在Spring Boot应用中,我们经常使用Redis作为缓存或消息队列来提升应用程序的性能。...通过这样的配置,我们可以方便地存储和检索自定义类型的对象,如`Student`,在Redis中,而无需关心底层的序列化细节。

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合Fastjson配置Redis序列化,确保数据正确存储和读取。 首先,我们需要在`pom.xml`中添加必要的依赖。Spring Boot的`spring-boot-starter-cache`模块...

    fastjson和jackson序列化数据的区别

    fastjson和jackson序列化数据的区别直奔主题一言不合就上代码注意 直奔主题 1、fastjson将字符串反序列化为对象时,只会处理第一层,内部会序列化为JsonObject或者JsonArray,使用二级结构和三级结构时还要再次处理...

    protostuff fastjson gson 高性能序列化jar包

    - Gson提供了丰富的API,如`GsonBuilder`,允许开发者定制序列化过程,比如忽略某些字段,或者设置日期格式等。 在实际应用中,选择哪个库主要取决于项目需求。如果需要与protobuf兼容,或者追求极致的性能和内存...

    fastjson1.2.69反序列化远程代码执行漏洞介绍.docx

    **Fastjson 1.2.69 反序列化远程代码执行漏洞详解** Fastjson 是阿里巴巴开源的一个高性能的 JSON 库,广泛应用于 Java 开发中,用于 JSON 的序列化和反序列化操作。然而,Fastjson 1.2.69 版本存在一个严重的反序...

    S14-fastjson反序列化1

    在这个例子中,我们关注的是 Fastjson 的序列化(Serialization)和反序列化(Deserialization)过程,特别是涉及到 `JSON.parseObject` 和 `JSON.parse` 方法。 1. **序列化(Serialization)**:序列化是将 Java ...

    fastjson、gson、jackson序列化和反序列化所用 json

    这些库提供了JSON的序列化和反序列化功能,将Java对象转换为JSON字符串,以及将JSON字符串转换回Java对象。 1. **Fastjson**:Fastjson是阿里巴巴开源的一个高性能的JSON库,它的设计目标是处理速度极快,API简洁...

    预警事项:Fastjson反序列化远程代码执行漏洞风险预警

    阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...

    fastjson1.2.8 反序列化远程代码执行漏洞

    astjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过...

    springmvc fastjson 反序列化时间格式化方法(推荐)

    在Spring MVC中,Fastjson是一个常用的JSON库,用于序列化和反序列化Java对象。当我们在处理日期时间字段时,可能会遇到反序列化时日期格式不一致的问题,导致默认显示为时间戳。本文将详细介绍两种解决Spring MVC中...

    C#简单快速的json组件fastJSON使用介绍.docx

    fastJSON 是一个开源的 JSON 序列化组件,可以用于 C# 中对 JSON 数据的序列化和反序列化。它的主要特点是速度快、易于使用,并且支持多种数据类型。 fastJSON 的优点 fastJSON 的优点包括: * 快速序列化和反...

    fastjson1.2.24反序列化RCE

    **Fastjson 1.2.24 反序列化远程代码执行漏洞详解** 在Java开发中,Fastjson是一个广泛使用的高性能JSON库,它提供了一种快速解析和生成JSON的机制。然而,像许多处理序列化和反序列化的库一样,Fastjson在某些版本...

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...

    fastJSON使用.pdf

    FastJSON 序列化一个 JSON 库涉及的最基本功能就是序列化和反序列化。FastJSON 支持 JavaBean 的直接序列化。你可以使用 com.alibaba.fastjson.JSON 这个类进行序列化和反序列化。基本序列化序列化就是把 JavaBean ...

    Fastjson工具进行JSON序列化

    JSON(Java Script Object ...重点说明了工具类fastjson 是怎么实现 JSON 的序列化和反序列化的。 首先你要确保在项目中已经添加了Fastjson的依赖包,否则需要手动添加。如果是Maven项目,可以在pom.xml中添加依赖;

    fastJson属性配置说明

    FastJson 是阿里巴巴开发的一款高效的 JSON 序列化与反序列化库,它广泛应用于 Java 开发中。在处理 HTTP 消息转换时,FastJson 提供了 FastJsonHttpMessageConverter 类,该类允许开发者自定义 JSON 序列化和反序列...

    Fastjson解析案例

    Fastjson的序列化过程是指将Java对象转换成JSON字符串,这对于将复杂的数据结构通过网络传输或者存储到文件中非常有用。例如,如果你有一个Java Bean对象,Fastjson可以将其属性及其值转化为JSON格式,使得数据易于...

    json序列化与反序列化demo

    在Java世界里,为了方便地进行JSON的序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象),有多个库提供了强大的支持,其中包括Gson、Jackson、Fastjson以及LoganSquare。接下来,我们将...

    Ruby-FastJSONAPI一个用于Ruby对象的快速JSONAPI的序列化器

    **Ruby FastJSONAPI:高效实现JSON:API序列化的利器** Ruby FastJSONAPI 是一个专为Ruby对象设计的高性能JSON:API序列化库。它旨在帮助开发者以简洁、高效的方式将Ruby对象转换为符合JSON:API规范的JSON格式,极大...

Global site tag (gtag.js) - Google Analytics