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);