关于数据序列化(3),JSON的方式,FastJson序列化对象和List集合示例
2017-09-15 12:01
701 查看
JSON也是对象序列化的一种方式
测试代码
FastJson反序列化的原理是 如果
如果要反序列的话的对象中有集合属性或者要反序列化一个集合,fastJson的反序列化,只能根据传入的class来生成一个集合,但是集合的元素为JSONObject。
如果是对象中的某个属性的声明不是具体的类。也会造成这种情况。
如果想完全的用fastjson序列化反序列化一个对象。
那么生成json字符串的时候需要
这样
1. 示例
public class FriendLikeVO { public String sn; public int score; public long time; public FriendLikeVO(JSONObject jo) { this.sn = jo.getString("sn"); this.score = jo.getIntValue("score"); this.time = jo.getLong("time"); } public FriendLikeVO() { } public FriendLikeVO(String sn, int score, long time) { this.sn = sn; this.score = score; this.time = time; } /** * 把Json转换为List */ public static List<FriendLikeVO> jsonToList(String json) { List<FriendLikeVO> result = new ArrayList<FriendLikeVO>(); JSONArray ja = JSON.parseArray(json); if (ja == null) { return result; } for (int i = 0; i < ja.size(); i++) { FriendLikeVO vo = new FriendLikeVO(ja.getJSONObject(i)); result.add(vo); } return result; } /** * 将List转换为Json */ public static String listToJson(List<FriendLikeVO> likeList) { JSONArray ja = new JSONArray(); likeList.stream().forEach(vo -> { JSONObject jo = new JSONObject(); jo.put("sn", vo.sn); jo.put("score", vo.score); jo.put("time", vo.time); ja.add(jo); }); return ja.toJSONString(); } }
2. 不想序列化的地方用ransient标注
但是用fastjson的序列化更简单一些,如果不想序列化的字段就标注transient就可以了public class FriendLike { public String sn; // 好友ID,目前为IP public int score; // 点赞的点数 public long time; public transient int cc; public FriendLike() { } public FriendLike(String sn, int score, long time) { this.sn = sn; this.score = score; this.time = time; } /** * 把Json转换为List */ @SuppressWarnings("unchecked") public static List<FriendLike> jsonToList(String json) { if(Util.isEmpty(json)){ return new ArrayList<FriendLike>(); } return JSON.parseObject(json, List.class); } /** * 将List转换为Json */ public static String listToJson(List<FriendLike> likeList) { if(null == likeList){ return null; } return JSON.toJSONString(likeList); } }
3.循环引用 不建议使用fastjson有bug
fastjson的循环引用问题,反序列化也是可以成功的测试代码
FriendLike fk = new FriendLike("a", 2, System.currentTimeMillis()); FriendLike fk2 = new FriendLike("b", 2, System.currentTimeMillis()); List<FriendLike> list = new ArrayList<>(); list.add(fk); list.add(fk2); list.add(fk2); String a = JSON.toJSONString(list); List<FriendLike> list2 = JSON.parseObject(a, List.class); System.out.println(a); System.out.println(list); 输出结果 [{"score":2,"sn":"a","time":1470211141179},{"score":2,"sn":"b","time":1470211141179},{"$ref":"$[1]"}] [FriendLike[sn=a,score=2,time=1470211141179], FriendLike[sn=b,score=2,time=1470211141179], FriendLike[sn=b,score=2,time=1470211141179]]
4. 序列化List
注意一个坑,如果要序列化List的时候应该使用JSON.parseArray这个方法,并且注意,被序列化的对象类型要有无参构造方法!@SuppressWarnings("unchecked") public static List<FriendHelpVO> jsonToList(String json) { if (Util.isEmpty(json)) { return new ArrayList<FriendHelpVO>(); } return JSON.parseArray(json, FriendHelpVO.class); }
5. 反序列化
tips:FastJson反序列化的原理是 如果
JSON.parseObject(json, obj.class);
如果要反序列的话的对象中有集合属性或者要反序列化一个集合,fastJson的反序列化,只能根据传入的class来生成一个集合,但是集合的元素为JSONObject。
如果是对象中的某个属性的声明不是具体的类。也会造成这种情况。
如果想完全的用fastjson序列化反序列化一个对象。
那么生成json字符串的时候需要
这样
JSON.toJSONString(v2,SerializerFeature.WriteClassName);
相关文章推荐
- 关于ASP.NET下,JQuery+AJAX使用JSON返回对象集合List数据的总结
- 一个关于Json数据List和对象嵌套反序列化的工具类,java(20151130)
- 序列化+fastjson和java各种数据对象相互转化
- C#将Json字符串反序列化成List对象类集合
- 关于使用struts2-json-plugin 插件,Json返回List对象数据为空解决方案
- .net 关于JSON转换为对象时出现的:数据协定类型 “***”无法反序列化,因为未找到必需的数据成员 **(字段名)
- fastJson如何序列化一个包含list对象的Map对象,如Map<String,List<T>>类型的对象
- 关于数据序列化(5),定制FastJSON序列化(解决Java大Long类型js的Number接收丢失数据的问题,不序列化某些属性)
- java方式的将java对象以及list或者map转化为json数据
- C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
- 关于数据序列化(4),FastJson的两个bug
- C#将58同城商圈接口返回Json字符串反序列化成List对象类集合绑定DropdownList
- 把list中的对象转换为json数据的方式
- java方式的将java对象以及list或者map转化为json数据
- C#将Json字符串反序列化成List对象类集合
- java方式的将java对象以及list或者map转化为json数据 .
- 转载:java方式的将java对象以及list或者map转化为json数据 .
- 关于JSON转换为对象时出现的:数据协定类型 “***”无法反序列化,因为未找到必需的数据成员 **(字段名)
- jQuery通过json的方式响应map的list对象集合,并以table的形式展示
- C#将Json字符串反序列化成List对象类集合