在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪。
很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下。Log4j 的时候,为了竞争,还推出了 java.util.logging,虽然最后也没多少人用。
PS:日志系统的四驾马车:Log4j、SLF4J、Logback、Log4j2 我已经肝完了,可以通过下面的地址获取 PDF:
地址:https://pan.baidu.com/s/1dPwsQhT5OMVapE7hGi7vww 密码:fxxy
Java 之所以牛逼,很大的功劳在于它的生态非常完备,JDK 没有 JSON 库,第三方类库有啊,还挺不错,比如说本篇的猪脚——Jackson,GitHub 上标星 6.1k,Spring Boot 的默认 JSON 解析器。
怎么证明这一点呢?
当我们通过 starter 新建一个 Spring Boot 的 Web 项目后,就可以在 Maven 的依赖项中看到 Jackson 的身影。
Jackson 有很多优点:
解析大文件的速度比较快;
运行时占用的内存比较少,性能更佳;
API 很灵活,容易进行扩展和定制。
Jackson 的核心模块由三部分组成:
jackson-core,核心包,提供基于“流模式”解析的相关 API,包括 JsonPaser 和 JsonGenerator。
jackson-annotations,注解包,提供标准的注解功能;
jackson-databind ,数据绑定包,提供基于“对象绑定”解析的相关 API ( ObjectMapper ) 和基于“树模型”解析的相关 API (JsonNode)。
01、引入 Jackson 依赖
要想使用 Jackson,需要在 pom.xml 文件中添加 Jackson 的依赖。
Maven 之所以讨人喜欢的一点就在这,能偷偷摸摸地帮我们把该做的做了。
02、使用 ObjectMapper
Jackson 最常用的 API 就是基于”对象绑定” 的 ObjectMapper,它通过 writeValue 的系列方法将 Java 对象序列化为 JSON,并且可以存储成不同的格式。
writeValueAsString(Object value) 方法,将对象存储成字符串
writeValueAsBytes(Object value) 方法,将对象存储成字节数组
writeValue(File resultFile, Object value) 方法,将对象存储成文件
来看一下存储成字符串的代码示例:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
- 微信搜索「沉默王二」,回复 Java
- @author 沉默王二
- @date 2020/11/26
*/
public class Demo {
public static void main(String[] args) throws JsonProcessingException {
Writer wanger = new Writer(“沉默王二”, 18);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(wanger);
System.out.println(jsonString);
}
}
class Writer {
private String name;
private int age;
public Writer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
程序输出结果如下所示:
{
“name” : “沉默王二”,
“age” : 18
}
不是所有的字段都支持序列化和反序列化,需要符合以下规则:
如果字段的修饰符是 public,则该字段可序列化和反序列化(不是标准写法)。
如果字段的修饰符不是 public,但是它的 getter 方法和 setter 方法是 public,则该字段可序列化和反序列化。getter 方法用于序列化,setter 方法用于反序列化。
如果