加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:14:41 所属栏目:百科 来源:网络整理
导读:今天帮助同事调试一个问题,说fastjson在序列化的时候是忽略大小写的,有测试代码,但是不知道为什么,我帮他看了下,特意将过程记录在这个地方。 Bean定义如下: public class Person{ private int id; private String name; public int getId(){return id;

今天帮助同事调试一个问题,说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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读