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