当前位置:首页 > 开发 > 编程语言 > Json > 正文

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

发表于: 2014-08-15   作者:asialee   来源:转载   浏览次数:
摘要:         今天帮助同事调试一个问题,说fastjson在序列化的时候是忽略大小写的,有测试代码,但是不知道为什么,我帮他看了下,特意将过程记录在这个地方。     Bean定义如下:         public class Person{ private int 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

   

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
  昨天心情真的太糟糕了,写完《学习Java,值得注意你注意的问题(1)》之后,迎来些许的支持以后
  在《学习Java,容易被你忽略的小细节(2)》中我们已经深入讨论过String类中equals()方法的使用
fastjson官方地址: http://code.alibabatech.com/wiki/display/FastJSON/Home 从javaeye上看到了阿
新项目年后就上线了,现在业务上没什么问题,就用TProfiler做了下性能分析,果然有坑。 一、TProfil
项目要求,对ckEditor编辑器做了一个全局高亮/取消高亮指定文字的功能,主要是为了兼容了IE。 以下
细节一: 在《从零开始学攻心术》中告诉你,男人擅长用攻心术征服自己想要的女人。 很多男人都明白
0.背景 最近项目中在做一个平台性质的东西,为其他业务系统提供某种服务,方式是向业务系统提供ifram
0.背景 最近项目中在做一个平台性质的东西,为其他业务系统提供某种服务,方式是向业务系统提供ifram
  记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个
我在写权限的查询的时候,用到了sql语句的链接写一下出错的时候的代码 $sqlpid="select auth_name f
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号