关于数据序列化(4),FastJson的两个bug
2017-07-29 19:03
543 查看
bug1 fastJson循环引用引发一个bug
fastJson可以将一个对象序列化为json,也可以通过反序列化出一个完整的对象。且支持循环引用。package com.sincetimes.website.core.common.support; import com.sincetimes.website.core.common.vo.ToStringAbstract; /** ::new */ public class DataSimpleVO { public String name; public Object value; public Object value1; public DataSimpleVO() { } public DataSimpleVO(String name, Object value) { this.name = name; this.value = value; } @Override public String toString() { return "DataSimpleVO [name=" + name + ", value=" + value + ", value1=" + value1 + "]"; } }
DataSimpleVO a = new DataSimpleVO("a", 1); DataSimpleVO b = new DataSimpleVO("b", 2); b.value = a; Map<String, Object> map = new HashMap<>(); map.put(a.name, a); b.value1 = map; String jsonStr = JSON.toJSONString(b); System.out.println(jsonStr); DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class); System.out.println(obj.toString());
执行结果
{"name":"b","value":{"name":"a","value":1},"value1":{"a":{"$ref":"$.value"}}} DataSimpleVO [name=b, value={"name":"a","value":1}, value1={"a":{"name":"a","value":1}}]
反序列化成功
改一下代码
DataSimpleVO a = new DataSimpleVO("a", 1); DataSimpleVO b = new DataSimpleVO("b", 2); b.value1 = a; Map<String, Object> map = new HashMap<>(); map.put(a.name, a); b.value = map; String jsonStr = JSON.toJSONString(b); System.out.println(jsonStr); DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class); System.out.println(obj.toString());
执行结果
{"name":"b","value":{"a":{"name":"a","value":1}},"value1":{"$ref":"$.value.a"}} DataSimpleVO [name=b, value={"a":{"name":"a","value":1}}, value1=null]
b中的value1为空,反序列化失败
bug2 要序列化的类含有Class类型属性引起的循环递归无法结束最后内存溢出
要序列化、反序列化的类public class Request implements Serializable { private static final long serialVersionUID = -3145939364922415428L; private Class<?> clazz; private String method; private Object param; public Class<?> getClazz() { return clazz; } public void setClazz(Class<?> clazz) { this.clazz = clazz; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public Object getParam() { return param; } public void setParam(Object param) { this.param = param; } public Object invoke(Object bean) throws Exception { return clazz.getMethod(method, param.getClass()).invoke(bean, param); } }
触发bug
Request r = new Request(); r.setClazz(Integer.class); String s = JSON.toJSONString(r, SerializerFeature.WriteClassName); System.out.println(s); JSON.parseObject(s);//bug 触发
我们看看内部
public static JSONObject parseObject(String text) { Object obj = parse(text); if (obj instanceof JSONObject) { return (JSONObject) obj; } return (JSONObject) JSON.toJSON(obj); }
如果改为JSON.parseObject(s, Request.class);或者直接使用JSON.parse(str)就没问题。
最后的建议:
不要使用JSON.parseObject(…)只使用JSON.parse(str);
相关文章推荐
- 关于数据序列化(3),JSON的方式,FastJson序列化对象和List集合示例
- 关于数据序列化(5),定制FastJSON序列化(解决Java大Long类型js的Number接收丢失数据的问题,不序列化某些属性)
- 关于fastjson序列化不可见特殊字符存在的bug
- .net 关于JSON转换为对象时出现的:数据协定类型 “***”无法反序列化,因为未找到必需的数据成员 **(字段名)
- fastjson生成和解析json数据,序列化和反序列化数据
- fastjson生成和解析json数据,序列化和反序列化数据
- fastjson序列化数据为空的字段如何处理的问题
- fastjson生成和解析json数据,序列化和反序列化数据
- java中fastjson生成和解析json数据(序列化和反序列化数据)
- FastJSON序列化特殊字符BUG
- fastjson生成和解析json数据,序列化和反序列化数据
- 关于:JSON数据反序列化(待补充)
- 关于fastjson序列化部分源码解析
- fastjson生成和解析json数据,序列化和反序列化数据
- 一个关于Json数据List和对象嵌套反序列化的工具类,java(20151130)
- fastjson生成和解析json数据,序列化和反序列化数据
- fastjson生成和解析json数据,序列化和反序列化数据
- 关于JSON转换为对象时出现的:数据协定类型 “***”无法反序列化,因为未找到必需的数据成员 **(字段名)
- 序列化+fastjson和java各种数据对象相互转化
- fastjson生成和解析json数据,序列化和反序列化数据