FastJson是使用非常广泛的序列化框架,可以在JSON字符串和Java Bean之间进行互相转换。
但是在使用时要尤其注意,不要在Java Bean的getXXX方法中调用JSON.toJSONString方法,否则会导致StackOverflowError。
原因是因为FastJson在序列化的时候,会根据一系列规则获取一个对象中的所有getter方法,然后依次执行。
如果一定要定义一个方法,调用JSON.toJSONString的话,想要避免这个问题,可以采用以下方法:
1、方法名不以get开头
2、使用@JSONField(serialize = false)修饰目标方法
3、使用@JSONType修饰该Bean,并ignore掉方法对应的属性名(getXxx -> xxx)
最后,作者之所以写这篇文章,是因为在工作中真的实实在在的碰到了这个问题。
发生问题的时候,我立刻想到改个方法名,把getJsonString改成了toJsonString解决了这个问题。因为我之前看到过关于FastJson的简单原理。
后来想着,既然FastJson设计成通过getter来进行序列化,那么他一定提供了一个口子,让开发者可以指定某些以get开头的方法不参与序列化。
1、修改方法名
首先我们可以通过修改方法名的方式解决这个问题,我们把getJsonString方法的名字改一下,只要不以get开头就可以了,如改为toJsonString。
2、使用JSONField注解
除了修改方法名以外,FastJson还提供了两个注解可以让我们使用,首先介绍JSONField注解,这个注解可以作用在方法上,如果其参数serialize设置成false,那么这个方法就不会被识别为getter方法,就不会参加序列化。
3、使用JSONType注解
FastJson还提供了另外一个注解——JSONType,这个注解用于修饰类,可以指定ignores和includes。如下面的例子,如果使用@JSONType(ignores = “jsonString”)定义BuyerInfo,则也可避免StackOverflowError。