有这样一个json,有没有什么办法将它一行代码转换为想要的结构:Map<String, User>?
答案是肯定的,借助alibaba的fastjson即可。代码如下:
package com.powerengine.demo;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import org.junit.Test;
import java.util.HashMap;
/**
* @author dongPo
* Date 2022/9/5
* Desc
*/
public class JsonTest {
@Test
public void t1() {
String json = "{\n" +
" \"lisa\":{\n" +
" \"roleIds\":[\n" +
" \"1\",\n" +
" \"2\"\n" +
" ],\n" +
" \"name\":\"lisa\",\n" +
" \"pwd\":\"111\"\n" +
" },\n" +
" \"jack\":{\n" +
" \"roleIds\":[\n" +
" \"3\",\n" +
" \"4\"\n" +
" ],\n" +
" \"name\":\"jack\",\n" +
" \"pwd\":\"222\"\n" +
" }\n" +
"}";
// TypeReference 的包为 import com.alibaba.fastjson.TypeReference;
HashMap<String, User> userMap = JSONObject.parseObject(json, new TypeReference<HashMap<String, User>>() {});
System.out.println(userMap.get("lisa").name);
}
}
最重要的一句:
JSONObject.parseObject(json, new TypeReference<HashMap<String, User>>() {});
// 注意最后的花括号不能少,TypeReference中的泛型就是要转换的自定义的类型
User对象如下:
package com.powerengine.demo;
import java.io.Serializable;
/**
* @author dongPo
* Date 2022/9/6
* Desc
*/
public class User implements Serializable {
private static final long serialVersionUID = -949663088546640229L;
String name;
transient String pwd;
String[] roleIds;
public String getName() {
return name;
}
public String getPwd() {
return pwd;
}
public String[] getRoleIds() {
return roleIds;
}
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public void setRoleIds(String[] roleIds) {
this.roleIds = roleIds;
}
public User() {
}
}
有了这个方法,就能省很多事了,不需要自己再去解析JSONObject,一步到位。