博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于fastjson在序列化成JSON串时字段增加的问题
阅读量:6680 次
发布时间:2019-06-25

本文共 1783 字,大约阅读时间需要 5 分钟。

今天在项目中遇到控制器中返回的对象经过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方法被调用了。

转载于:https://www.cnblogs.com/insaneXs/p/8964170.html

你可能感兴趣的文章
网络osi
查看>>
WINREG.H 编译出错
查看>>
Detours的使用准备
查看>>
Hibernate核心配置文件
查看>>
SpringBoot学习之一 Unable to find a single main class from the following candidates
查看>>
SpringCloud学习成长 四 断路器(Hystrix)
查看>>
UIAlertView
查看>>
xfs 文件系统损坏修复 fscheck
查看>>
Hibernate之一级缓存
查看>>
Python基础之定义有默认参数的函数
查看>>
443. String Compression - Easy
查看>>
Unity中那些事半功倍的好插件
查看>>
最全的Markdown语法
查看>>
npm i 的几种方式区别
查看>>
Eclipse界面简介
查看>>
iOS5中的UUID
查看>>
(转载)XML Tutorial for iOS: How To Read and Write XML Documents with GDataXML
查看>>
指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射...
查看>>
poj 3259 Wormholes
查看>>
Apache CXFjar包目录(转)
查看>>