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

   

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fastjson2 是一个Java语言编写的JSON解析库,可以实现JSON字符串与Java对象之间的相互转换。在fastjson2中,反序列化大小写是指在将JSON字符串转换为Java对象时,对于属性名的大小写敏感性。 在默认情况下,fastjson2是大小写敏感的,即JSON字符串中的属性名必须与Java对象中的属性名完全匹配,包括大小写。如果属性名大小写不匹配,fastjson2会无法正确地将JSON字符串转换为Java对象。 而,fastjson2也提供了一些配置选项来实现反序列化大小写敏感的功能。可以通过以下两种方式来实现: 1. 使用@JSONField注解:可以在Java对象的属性上使用@JSONField注解,并设置name属性来指定对应的JSON属性名。通过设置name属性为大小写敏感的值,可以实现反序列化大小写敏感的效果。 示例代码如下: ```java public class User { @JSONField(name = "username") private String userName; // getter and setter } ``` 2. 使用ParserConfig配置:可以通过ParserConfig类来配置fastjson2的解析器,设置属性名的大小写敏感性。可以使用ParserConfig.getGlobalInstance()方法获取全局的ParserConfig实例,并调用setFieldBased()方法设置属性名大小写敏感。 示例代码如下: ```java ParserConfig config = ParserConfig.getGlobalInstance(); config.setFieldBased(true); ``` 通过以上两种方式,可以实现fastjson2反序列化大小写敏感的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值