• 关于fastjson在序列化成JSON串时字段增加的问题


    今天在项目中遇到控制器中返回的对象经过fastjsonMessageConverter转换后,前台收到的json中多了一个字段A的问题。而返回的这个对象中根本就没有定义这个字段A。

    查了好久才发现对象中虽然没有这个字段A,但是有个叫做isA()的方法。

    原来fastjson在序列化时是根据方法来的,而不是根据字段来的!

    既然找到了问题。那么自然就好解决了。可以为这个方法加上@JSONField(serialize=false),让它不参与序列化。

    其实最主要的还是在定义对象时,严格按照POJO的规范来。

    不过既然出现了问题,我们不妨来测试一下fastjson的序列化的规则。

    测试代码:

    package com.insanexs.fastjson;
    
    import com.alibaba.fastjson.JSON;
    
    public class Foo {
        //有set/get方法
        private String prop1;
    
        //有操作概属性的方法,但不是set/get方法
        private String prop2;
    
        //没有方法直接操作这个属性,由构造函数传入
        private String prop3;
    
        private boolean prop4;
    
        public Foo(){
    
        }
    
        public Foo(String prop1, String prop2, String prop3, boolean prop4){
            this.prop1 = prop1;
            this.prop2 = prop2;
            this.prop3 = prop3;
            this.prop4 = prop4;
        }
    
        public String getProp1() {
            return prop1;
        }
    
        public void setProp1(String prop1) {
            this.prop1 = prop1;
        }
    
        public String popProp2(){
            return prop2;
        }
    
        public void pushProp2(String prop2){
            this.prop2 = prop2;
        }
    
        //增加了打印,便于了解调用了哪个函数
        public boolean isProp4(){
            System.out.println("invoke isProp4()");
            return prop4;
        }
    
        public boolean getProp4(){
            System.out.println("invoke getProp4()");
            return prop4;
        }
    
    
        //没有对应属性,只有get方法
        public String getProp5(){
            return "4";
        }
    
        //没有对应属性,有一个is方法
        public boolean isProp6(){
            return true;
        }
    
    
        public static void main(String[] args){
            Foo f = new Foo("1","2","3", false);
    
            String text = JSON.toJSONString(f);
            System.out.println(text);
        }
    }

    我们可以看到控制台的输出是:

    我们可以看到虽然对象有prop2和prop3,但是因为没有对应的set/get方法,导致属性没有被序列化。而prop5和prop6虽然对象没有直接定义这个属性,但是因为有对应的方法,因此也被序列化输出了。

    对于同时存在isXX和getXX的属性,get要先于is方法。如果我们注释了get方法,会发现is方法被调用了。

  • 相关阅读:
    一生不可错过的五句话
    分布式缓存系统Memcached简介与实践[转]
    telnet serverip serverport 可以测试服务器端口是否通
    使用c#生成高品质小空间的缩略图
    sql server2005对tsql的增强之在聚合函数的后面使用over关键字
    (转)让你受益终身的10个Word实用技巧
    sql取所有记录中每天的最后一笔交易的记录
    屏蔽服务器端包含在文件不存在时报错的错误信息
    c#农历日历类
    Niubility 英语教程
  • 原文地址:https://www.cnblogs.com/insaneXs/p/8964170.html
Copyright © 2020-2023  润新知