关于fastjson在序列化成JSON串时字段增加的问题
Posted insaneXs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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方法被调用了。
以上是关于关于fastjson在序列化成JSON串时字段增加的问题的主要内容,如果未能解决你的问题,请参考以下文章