一、背景
在前后端分离的项目中,后端经常涉及到json与对象互转的场景。之前使用的是Fastjson,但是,因为技术选型的原因,选择了SpringBoot自带的Jackson。
这篇文章就简单的介绍下如何使用Jackson来进行json和对象的相互转换
二、使用
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {
private String companyName;
private List<WebSite> webSites;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebSite {
private String webSiteName;
private List<User> users;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String userId;
private String username;
private String password;
}
1.对象转json字符串Test
@Test
public void testObject2Json2() {
User user2 = new User("1","上海辟谣专属队","职业辟谣,不信谣,不传谣,呵呵");
List<User> users = new ArrayList<>();
users.add(user2);
WebSite webSite = new WebSite();
webSite.setWebSiteName("xxxxxx.com");
webSite.setUsers(users);
List<WebSite> webSites = new ArrayList<>();
webSites.add(webSite);
Company company = new Company();
company.setCompanyName("yyyyyy");
company.setWebSites(webSites);
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(company);
System.out.println(jsonString);
} catch (JsonProcessingException e) {
log.error("error: ", e);
}
}
输出:
{"companyName":"yyyyyy","webSites":[{"webSiteName":"xxxxxx.com","users":[{"userId":"1","username":"上海辟谣专属队","password":"职业辟谣,不信谣,不传谣,呵呵"}]}]}
2.json字符串转对象
①json单字符串转单对象
@Test
public void testJson2Object() {
String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" +
"{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}]}" +
"]}";
ObjectMapper objectMapper = new ObjectMapper();
try {
Company company = objectMapper.readValue(json, Company.class);
System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
} catch (JsonProcessingException e) {
log.error("error: ", e);
}
}
输出:
上海辟谣专属队
②json数组字符串转list集合对象
@Test
public void testJsonArrayString2ObjectArray() {
String json = "[" +
"{\"userId\":\"1\",\"username\":\"上海带刀沪卫\",\"password\":\"带刀大佬\"}" +
",{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" +
"]";
ObjectMapper objectMapper = new ObjectMapper();
try {
TypeReference<List<User>> typeReference = new TypeReference<List<User>>() {
};
List<User> list = objectMapper.readValue(json, typeReference);
list.forEach(user -> {
System.out.println(user.getUsername());
});
} catch (JsonProcessingException e) {
log.error("error: ", e);
}
注:为什么会由
有数组json的转换时,需要指定jackson反序列化为什么类型,而不是让它自主决定反序列化成什么类型,需要用到TypeReference。
输出:
上海带刀沪卫
上海辟谣专属队
对多层嵌套同样适用
@Test
public void testJsonArrayString2ObjectArray2() {
String json = "[" +
"{" +
"\"companyName\":\"yyyyyy\",\"webSites\":[" +
"{\"webSiteName\":\"xxxxxx.com\",\"users\":[" +
"{\"userId\":\"1\",\"username\":\"上海辟谣专属队\",\"password\":\"职业辟谣,不信谣,不传谣,呵呵\"}" +
"]" +
"}" +
"]" +
"}" +
"]";
ObjectMapper objectMapper = new ObjectMapper();
try {
TypeReference<List<Company>> typeReference = new TypeReference<List<Company>>() {
};
List<Company> list = objectMapper.readValue(json, typeReference);
list.forEach(company -> {
System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
});
} catch (JsonProcessingException e) {
log.error("error: ", e);
}
}