json序列化与反序列化
应用场景
在开发过程中,需要通过网关,网关限制了输入、输出的格式,所以需要将实体转换为map格式,因此对json的序列化与反序列化进行总结
开发环境
fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>
实体转json
@Test
public void testJson(){
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
//实体转json
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user1));
System.out.println(jsonObject);
}
输出:
{“sex”:“1”,“name”:“zhangsan”}
Process finished with exit code 0
实际上输出的是JSON的toString,因为
会自动调用toString。
json序列化
转换格式:jsonObject => String
@Test
public void testJson(){
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
//实体转json
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user1));
System.out.println("实体转json: "+jsonObject);
//json序列化
System.out.println("json序列化: "+jsonObject.toJSONString());
}
实体转json: {“sex”:“1”,“name”:“zhangsan”}
json序列化: {“sex”:“1”,“name”:“zhangsan”}Process finished with exit code 0
实体和map的转换
实体:
public static class User{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
加静态的原因是私有非静态方法不能进行转换,实际应用中都是单独的实体类。
@Test
public void testJson(){
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
//实体转map
Map map = JSON.parseObject(jsonObject.toJSONString(user1), Map.class);
System.out.println("实体转map: "+map);
}
实体转map: {sex=1, name=zhangsan}
@Test
public void testJson(){
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
//实体转map
Map map = JSON.parseObject(jsonObject.toJSONString(user1), Map.class);
System.out.println("实体转map: "+map);
//map转实体
User user = JSON.parseObject(jsonObject.toJSONString(map), User.class);
System.out.println("map转实体: "+user);
}
实体转map: {sex=1, name=zhangsan}
map转实体: com.compressfile.demo.utils.ZipUtilsTest$User@ec756bd
泛型实体转换
在实际应用中,我们经常用到带有泛型的实体,使用上述方法并不能实现json的序列化与反序列化(有兴趣可以自己试试,当然你要搜到这个肯定是遇到了同样的问题)
正确实现方法:
泛型实体:
private static class Store<T>{
private T person;
private String storeName;
public T getPerson() {
return person;
}
public void setPerson(T person) {
this.person = person;
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
}
尝试转换
@Test
public void testJson(){
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
Store<User> store = new Store<>();
store.setPerson(user1);
store.setStoreName("今天成为大神了吗");
System.out.println(JSON.toJSONString(store));
Store store1 = JSON.parseObject(JSON.toJSONString(store), Store.class);
User person = (User) store1.getPerson();
System.out.println(person.getName());
}
可以看出,当我们尝试直接转换的时候会报错,因为带泛型的实体转换不出泛型
正确实现:
@Test
public void testJson() {
User user1 = new User();
user1.setName("zhangsan");
user1.setSex("1");
Store<User> store = new Store<>();
store.setPerson(user1);
store.setStoreName("今天成为大神了吗");
System.out.println(JSON.toJSONString(store));
Store<User> store1 = JSON.parseObject(JSON.toJSONString(store), new TypeReference<Store<User>>() {
});
User person = (User) store1.getPerson();
System.out.println(person.getName());
}