如何分析fastjson反序列化源码?FastJSON反序列化顺序问题怎么弄?

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有什么区别?

intellij idea安装步骤有哪些?intellij idea安装步骤

java架构师有什么证书么?需要具备什么能力?