FastJson toJSONString 解析报错
2019-08-26 本文已影响0人
不知名的蛋挞
代码
public class MessageBody {
private String who;
private String are;
private static MessageContent you;
public DRMessageBody(){ }
//转Json
public String toJson(){
String json = JSON.toJSONString(this);
if(json ==null){
throw new RuntimeException("json parese erro");
}
return json;
}
public int getLengthOfByte(){
String json = toJson();
int num = -1;
num = json.getBytes().length;
if(num==-1){
new RuntimeException("Messagebody of json length is error!");
}
return num;
}
}
上面的代码 用下面的 测试
MessageBody body = JSON.parseObject(Json, MessageBody.class);
String result = JSON.toJSONString(body);
System.out.println(body);
System.out.println(result);
运行后报错:
java.lang.StackOverflowError
at java.util.IdentityHashMap.containsKey(IdentityHashMap.java:349)
at com.alibaba.fastjson.serializer.JavaBeanSerializer.writeReference(JavaBeanSerializer.java:395)
at com.alibaba.fastjson.serializer.ASMSerializer_2_DRMessageContent.write(Unknown Source)
at com.alibaba.fastjson.serializer.ASMSerializer_1_DRMessageBody.write(Unknown Source)
原因分析
FastJson
在使用 toJSONString
会使用 写入操作,而 我的类里面有这样一个方法 public int getLengthOfByte()
,这样FastJson
就会认为 这个类 有一个 lengthOfByte
的属性,于是就出现了异常。
解决方法
@JSONType(ignores = "lengthOfByte")
public class DRMessageBody {
public int getLengthOfByte(){
String json = toJson();
int num = -1;
num = json.getBytes().length;
if(num==-1){
new RuntimeException("Messagebody of json length is error!");
}
return num;
}
}
使用 @JSONType(ignores = "lengthOfByte")
忽略 这个属性 就可以了