原文来自:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=3637281
fastjson网站
问题
在1.1.3版本之前,fastjson不支持循环引用。有些对象存在循环引用,例如:
public
static
class
Department {
private
int
id;
private
String name;
private
Department parent;
private
List<Department> children =
new
ArrayList<Department>();
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; }
public
Department getParent() {
return
parent; }
public
void
setParent(Department parent) {
this
.parent = parent; }
public
List<Department> getChildren() {
return
children; }
public
void
setChildren(List<Department> children) {
this
.children = children; }
}
|
这个代码中,parent和children之间存在循环应用了,执行JSON序列化时会报错:“com.alibaba.fastjson.JSONException: maybe circular references”
解决办法一
在parent字段上添加修饰符transient
public
static
class
Department {
private
int
id;
private
String name;
// 使用transient
private
transient
Department parent;
private
List<Department> children =
new
ArrayList<Department>();
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; }
public
Department getParent() {
return
parent; }
public
void
setParent(Department parent) {
this
.parent = parent; }
public
List<Department> getChildren() {
return
children; }
public
void
setChildren(List<Department> children) {
this
.children = children; }
}
|
解决办法二
使用Annotation @JSONField标注不需要序列化getParent属性
public
static
class
Department {
private
int
id;
private
String name;
private
Department parent;
private
List<Department> children =
new
ArrayList<Department>();
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; }
// 使用@JSONField
@JSONField
(serialize=
false
)
public
Department getParent() {
return
parent; }
public
void
setParent(Department parent) {
this
.parent = parent; }
public
List<Department> getChildren() {
return
children; }
public
void
setChildren(List<Department> children) {
this
.children = children; }
|