文章目录
- 前言
- 一、Java中的Json序列化,不容忽视的getter
- 二、问题重现
- 1.核心代码
- 2.问题分析
- 2.1常用 JSON序列化库 的序列化原理:
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Java中的Json序列化,不容忽视的getter
示例:Springboot的项目
二、问题重现
1.核心代码
代码如下(示例):
1.Person 类对象
@AllArgsConstructor
@Getter
public class Person implements IPserson{
private String name;
private String sex;
private Integer age;
@Override
public String getPassword() {
return null;
}
@Override
public String getUsername() {
return null;
}
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
}
2.IPerson 接口
public interface IPserson {
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
3、以JSON的形式保存到 Redis 中
redisTemplate.opsForValue().set("person", new com.moyun.practice.Person("杨国富", "女", 18));
4、 Redis 中保存的数据
2.问题分析
深入探讨
带着这份好奇,我把java中常用的json序列化的库都试了一下,看看是否都是这样。主流的库有jackson、fastjson和gson。
经过测试发现,jackson和阿里的fastjson返回的json字符串都带有一个jsonstr字段,唯独google的gson返回了我们预期的结果——只序列化对象的field。
2.1常用 JSON序列化库 的序列化原理:
jackson和fastjson
在序列化的时候,先利用反射找到对象类的所有get方法,接下来去get,然后小写化,作为json的每个key值,而get方法的返回值作为value。接下来再反射field,添加到json中。
gson
没有找到通俗的讲法,不过感觉应该就和getter方法无关吧。
所以,可以看大我们的AjaxJson类中存在这样一个getJsonStr,因此,jsonStr就作为key,序列化到json中了。
当然在jackson中,提供了相应的annotation,可以把这类方法忽略掉。在方法前加上**@JsonIgnore **即可。
个人理解
遇到问题的时候,千万不要忽略一些简单的地方,例如getter和setter方法。用getXXX的地方,可以用fetch等替代。
有时我们会在类中定义例如private int mAge的变量,而getter的方法是getAge()。显然我们希望在序列化的时候得到的key为age而非mAge,那么反射getter方法也就有它存在的意义了。
总结
JSON 序列化的影响