使用com.alibaba.fastjson包来进行Json的组装和解析
在组装和解析时,避免使用map去手动拼装,而应该使用类对应一个json对象。
不期望的代码:
private Map<String, Object> getJsonMap(String userName,
String salt,
Integer id) {
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("userName", userName);
jsonMap.put("salt", salt);
jsonMap.put("id", id);
return jsonMap;
}
组装Json
组装如下的json
{
"CloudUserList": [
{
"CloudUser": {
"id": 1,
"salt": "salt",
"userName": "Willow1"
}
},
{
"CloudUser": {
"id": 2,
"salt": "salt2",
"userName": "Willow2"
}
}
]
}
对应的类:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class UserData {
@JSONField(name = "CloudUserList")
private List<ListInfo> cloudUserList;
@Data
public static class ListInfo{
@JSONField(name = "CloudUser")
CloudUser cloudUser;
}
@Data
public static class CloudUser{
private String userName;
private String salt;
private Integer id;
}
//测试
public static void main(String[] args){
UserData data = new UserData ();
UserData.CloudUser one = new UserData.CloudUser();
one.setId(1);
one.setUserName("Willow1");
one.setSalt("salt");
UserData.CloudUser two = new UserData.CloudUser();
two.setId(2);
two.setUserName("Willow2");
two.setSalt("salt2");
UserData.ListInfo listOne = new UserData.ListInfo();
listOne.setCloudUser(one);
UserData.ListInfo listTwo = new UserData.ListInfo();
listTwo.setCloudUser(two);
List<UserData.ListInfo> list = new ArrayList<>();
data.setCloudUserList(list);
list.add(listOne);
list.add(listTwo);
String res = JSON.toJSONString(data);
System.out.println(res);
}
}
打印结果与预期一致。
需要注意的是json的层次结构,CloudUserList里是还有一层,再里面才是每个CloudUser对象。
解析Json
解析Json成指定类:
{
"statusCode": 99,
"statusString": "Batch Processing",
"subStatusCode": "allSuccess",
"errorCode": 1,
"errorMsg": "allSuccess",
"Info": {
"StatusList": [
{
"Status": {
"no": 1,
"statusCode": 1,
"statusString": "OK",
"subStatusCode": "ok",
"errorCode": 1,
"errorMsg": "ok",
}
},
{
"Status": {
"no": 2,
"statusCode": 1,
"statusString": "OK",
"subStatusCode": "ok",
"errorCode": 1,
"errorMsg": "ok",
}
},
{
"Status": {
"no": 3,
"statusCode": 1,
"statusString": "OK",
"subStatusCode": "ok",
"errorCode": 1,
"errorMsg": "ok",
}
}
]
}
}
对应的类:
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.List;
@Data
public class UserResDto {
private String statusCode;
private String statusString;
private String subStatusCode;
private Integer errorCode;
private String errorMsg;
@JSONField(name ="Info" )
private Info info;
@Data
public static class Info {
private List<StatusInfo> statusList;
}
@Data
public static class StatusInfo {
private Status Status;
}
@Data
public static class Status {
private Integer no;
private String statusCode;
private String statusString;
private String subStatusCode;
private Integer errorCode;
private String errorMsg;
}
public static void main(String[] args) {
String json = "{\n" +
"\t\"statusCode\": 99,\n" +
"\t\"statusString\": \"Batch Processing\",\n" +
"\t\"subStatusCode\": \"allSuccess\",\n" +
"\t\"errorCode\": 1,\n" +
"\t\"errorMsg\": \"allSuccess\",\n" +
"\t\"Info\": {\n" +
"\t\t\"StatusList\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"Status\": {\n" +
"\t\t\t\t\t\"no\": 1,\n" +
"\t\t\t\t\t\"statusCode\": 1,\n" +
"\t\t\t\t\t\"statusString\": \"OK\",\n" +
"\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
"\t\t\t\t\t\"errorCode\": 1,\n" +
"\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
"\t\t\t\t}\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"Status\": {\n" +
"\t\t\t\t\t\"no\": 2,\n" +
"\t\t\t\t\t\"statusCode\": 1,\n" +
"\t\t\t\t\t\"statusString\": \"OK\",\n" +
"\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
"\t\t\t\t\t\"errorCode\": 1,\n" +
"\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
"\t\t\t\t}\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"Status\": {\n" +
"\t\t\t\t\t\"no\": 3,\n" +
"\t\t\t\t\t\"statusCode\": 1,\n" +
"\t\t\t\t\t\"statusString\": \"OK\",\n" +
"\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
"\t\t\t\t\t\"errorCode\": 1,\n" +
"\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
"\t\t\t\t}\n" +
"\t\t\t}\n" +
"\t\t]\n" +
"\t}\n" +
"}";
UserResDto dto = JSONObject.parseObject(json, UserResDto.class);
System.out.println(dto);
}
}
输出结果中无null值,每个成员变量均赋值成功。
注意"Status"与"StatusList"中间还隔着一层,虽然没有具体名字的json字段,但是对应一个类StatusInfo。
其他简单的json序列化和反序列化均可参考此例进行拓展。