天天看點

JSON字元串轉換為Java對象

json字元串轉換為Java對象

在背景開發的過程中,經常使用 json 作為資料傳輸的格式;為了友善開發,通常會将 json 轉化為對象,那麼如何将 json 轉化為 java 對象呢?

以如下 json 字元串為例:

{
	"status":
		{
			"code":0,
			"msg":"成功"
		},
	"result":
		{
			"pendingCount":"3",
			"groupList":
				[
					{"flag":"master","pending":"2","group":"fmq1"},
					{"flag":"master","pending":"0","group":"fmq2"},
					{"flag":"master","pending":"1","group":"fmq3"},
					{"flag":"master","pending":"0","group":"fmq4"}
				]
		}
}
           

首先根據 json 定義對應的類

1.定義一個封裝整個傳回值的類

public class ResultDTO<T> {

    private StatusDTO status;
    private T result;

    @Override
    public String toString(){
        return "status:{" + status.toString() + "}" +
                ",result:" + result.toString() ;

    }
}
           

2.定義封裝了 status 的類

public class StatusDTO {

    private Integer code;
    private String msg;

    @Override
    public String toString(){
        return "code:" + code +
                ",msg:" + msg;
    }
           

3.定義封裝了 result 的類

在實際的開發過程中,傳回的 result 根據不同的接口函數,通常有很多種類,我們可以為每個接口的 result 定義一個對象,對上面 json 中的 result,我們定義了一個 PendingDTO 對象:

public class PendingDTO {
    
    private Integer pendingCount;
    private List<GroupDTO> groupList;
    
	@Override
    public String toString(){
        String gl = "";
        if(groupList != null){
            for(GroupDTO g:groupList){
                gl+=g.toString() + ",";
            }
        }
        return "pendingCount:" + pendingCount +
                ",groupList:{" + gl +
                "}";
    }
}
           
public class GroupDTO {
    private String flag;
    private Integer pending;
    private String group;
    
	@Override
    public String toString(){
        return "flag:" + flag +
                ",pending:" + pending +
                ",group:" + group;
    }
}
           

轉換

使用 FastJson 進行轉換

ResultDTO<JSON> resultDTO = JSONObject.parseObject(json, ResultDTO.class);
PendingDTO pendingDTO = JSONObject.toJavaObject(resultDTO.getResult(), PendingDTO.class);
           

JSON官方的解析

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

JSONObject jsonObject = JSONObject.fromObject(json);
JSONObject object = jsonObject.getJSONObject("status");
Integer code = object.getInteger("code");
String msg = object.getString("msg");
           

遇到的問題

net.sf.json.JSONObject

包不能處理字元串為 null 的情況,會報空指針的錯誤;

換成

com.alibaba.fastjson.JSONObject

包就好了。

fastjson 被提出有安全漏洞不能使用

試過了 gson 等一系列 json 包,大多數都無法處理空值的情況,最後jackson 成功解析,代碼如下

ObjectMapper mapper = new ObjectMapper();
PendingDTO pendingDTO = mapper.readValue(json,PendingDTO.class);