您的位置:首页 > Web前端 > JavaScript

关于数据序列化(3),JSON的方式,FastJson序列化对象和List集合示例

2017-09-15 12:01 701 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐