Fastjson是Alibaba开发的Java语言编写的高性能JSON库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,但是实际运用中,很多人不会分析fastjson反序列化源码,那么下面我们就给大家讲解一下。
1.提供json字符串如:
{"status":"1","message":"登录成功"}
{"status":"1","message":"登录成功","data":{"name":"Tom","age":"18","phone":"18888888888"}}
2.修改实体类对象(新增json多层数据结构)
package cn.xiaobing.pojo; import java.util.Map; /**创建实体类ResultJson,属性与提供jsonString中的key保持一致 * @author Administrator */ public class ResultJson { private String status; private String message; private Mapdatas; public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MapgetDatas() { return datas; } public void setDatas(Mapdatas) { this.datas = datas; } public ResultJson() { super(); } public ResultJson(String status, String message, Mapdatas) { super(); this.status = status; this.message = message; this.datas = datas; } @Override public String toString() { return "ResultJson [status=" + status + ", message=" + message + ", datas=" + datas + "]"; } }
利用fastJson实现json字符串的反序列化
package cn.xiaobing.json; import java.util.Map; import com.alibaba.fastjson.JSONObject; import cn.xiaobing.pojo.ResultJson; /**利用fastJson实现json字符串的反序列化 * @author Administrator */ public class jsonDemo01 { //提供json字符串{"status":"1","message":"登录成功"} static String jsonString = "{\"status\":\"1\",\"message\":\"登录成功\"}"; static String multilayerJsonString = "{\"status\":\"1\",\"message\":\"登录成功\",\"datas\":{\"name\":\"Tom\",\"age\":\"18\",\"phone\":\"18888888888\"}}"; /** * 利用fastJson实现json字符串反序列化为对象 */ public static ResultJson jsonStringToEntity(String jsonString) { //创建实体类 resultJson,利用fastjson中JSONObject类的parseObject方法,实现将jsonString转化为对象ResultJson ResultJson resultJson = JSONObject.parseObject(jsonString, ResultJson.class); return resultJson; } /** * 利用fastJson实现json字符串保存Map中 * @param jsonString */ public static MapjsonStringToMapping(String jsonString) { //将json字符串封装到Map Mapmap = (Map) JSONObject.parse(jsonString); return map; } /** * 利用fastJson实现json(多层嵌套json)字符串反序列化为对象 */ public static ResultJson multilayerJsonStringToEntity(String multilayerJsonString) { //创建实体类 resultJson,利用fastjson中JSONObject类的parseObject方法,实现将jsonString转化为对象ResultJson ResultJson resultJson = JSONObject.parseObject(multilayerJsonString, ResultJson.class); return resultJson; } public static void main(String[] args) { ResultJson resultJson1 = jsonStringToEntity(jsonString); System.out.println("json转换成对象输出:" + "{status:" + resultJson1.getStatus() + ",message:" + resultJson1.getMessage() + "}"); Mapmap1 = jsonStringToMapping(jsonString); System.out.println("json转换成Map输出:" + "{status:" + map1.get("status") + ",message:" + map1.get("message") + "}"); ResultJson resultJson2 = multilayerJsonStringToEntity(multilayerJsonString); Mapmap2 = resultJson2.getDatas(); System.out.println("json(多层嵌套json)转换成对象输出:" + "{status:" + resultJson2.getStatus() + ",message:" + resultJson2.getMessage() + " ,datas:{name:" + map2.get("name") + ",age:" + map2.get("age") + ",phone:" + map2.get("phone") + "}}"); } }
FastJSON反序列化顺序问题怎么弄?
1. 本身设置排序规则,经过JSONType的orders来指定排序规则:
/
/ 设置排序规则@JSONType(orders={"user_name","passwd"})public class LoginBean {// 设置别名user_name @JSONField(name = "user_name") private String userName; // 帐户 private String passwd; // 密码 }
2. 经过JSONField的ordinal来指定顺序,这个特性须要1.1.42以上版本
public static class VO { @JSONField(ordinal = 3) private int f0; @JSONField(ordinal = 2) private int f1; @JSONField(ordinal = 1) private int f2; }
3. 指定序列化的排序方式,使用Feature.OrderedField按照字段排序
JSON.parseObject("...", Feature.OrderedField)
4. 官方提供的方式是配置JSONType.alphabetic的值为false,可是好像不太好用
@JSONType(alphabetic = false) public static class B { public int f2; public int f1; public int f0; }
fastjson反序列化的知识一直是个重要,所以我们在学java的时候,对于这方面知识一定要举一反三,学会分析源码,这样才能进行开发!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读:
jsonobject怎么转为map?json类型和map有什么区别?