【日常业务开发】常用JSON库API
- Gson
- Java 对象转 Json字符串(序列化)
- Json字符串转Java 对象(反序列化)
- FastJson
- Java 对象转 Json字符串(序列化)
- Json字符串转Java 对象(反序列化)
- Jackson
- Java 对象转 Json字符串(序列化)
- Json字符串转Java 对象(反序列化)
- Json 字符串内容反序列化为 Json 节点对象
- Java 对象与 Json 节点对象的转换
Gson
GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以快速的将一个 Json 字符转成一个 Java 对象,或者将一个 Java 对象转化为 Json 字符串。SpringBoot默认对gson已经存在了版本控制。可以指定version版本覆盖boot默认版本。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
Java 对象转 Json字符串(序列化)
String toJson(Object src) | 将指定的对象序列化为其等效的Json表示形式,当指定的对象不是泛型类型时,应使用此方法,如果对象是泛型类型,请改用 toJson(object,type). |
---|---|
String toJson(Object src, Type typeOfSrc) | 将指定的对象(包括泛型类型的对象)序列化为其等效的Json表示形式,对于非泛型对象,请改用{@link#toJson(Object)} |
String toJson(JsonElement jsonElement) | 将 JsonElement 转换为其等效的JSON表示形式。 |
JsonElement toJsonTree(Object src) | 将指定的对象序列化为 JsonElement 的等效表示形式,当指定的对象不是泛型类型时,应使用此方法;如果对象是泛型类型,请改用{@link#toJsonTree(object,type)} |
@Data
public class Teacher {
private Integer id;
private String name;
List<Student> students;
}
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
}
@Test
public void testToJson() {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
Gson gson = new Gson();
String str = gson.toJson(teacher);
System.out.println(str);
}
Json字符串转Java 对象(反序列化)
T fromJson(String json, Class classOfT) | 将指定的 Json 反序列化为指定类的对象,如果指定的类是泛型类型,则使用 fromJson(String, Type)方法。 |
---|---|
T fromJson(String json, Type typeOfT) | 将指定的 Json 反序列化为指定类型的对象,如果指定的对象是泛型类型,则此方法很有用,对于非泛型对象,请改用 fromJson(String json, Class classOfT) |
T fromJson(JsonElement json, Class classOfT) | 将指定的 json 元素反序列化为指定类型的对象,如果指定的类是泛型类型,则使用 fromJson(JsonElement, Type) 方法。 |
T fromJson(JsonElement json, Type typeOfT) | |
T fromJson(Reader json, Class classOfT) | |
T fromJson(Reader json, Type typeOfT) | 将从指定字符输入流读取的Json反序列化为指定类的对象 |
/**
* fromJson方法做与 toJson 相反的操作,将 json 格式的字符串转为基本数据类型、 POJO 对象、List、Map 、JsonElement 等
*/
@Test
public void testFromJson() {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
Gson gson = new Gson();
Teacher teacher = gson.fromJson(str, Teacher.class);
System.out.println(teacher);
}
FastJson
fastjson 是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
FASTJSON v2
是FASTJSON
项目的重要升级,FASTJSON v2
性能有了很大提升,目标是为下一个十年提供一个高性能的JSON
库。通过同一套API
,
- 支持JSON/JSONB两种协议,JSONPath是一等公民。
- 支持全量解析和部分解析。
- 支持Java服务端、客户端Android、大数据场景。
- 支持Kotlin
- 支持Android (2.0.3.android)
- 支持Graal Native-Image (2.0.3.graal)
在 fastjson v2 中,package 和 1.x 不一样,是 com.alibaba.fastjson2,如果你之前用的是fastjson1,大多数情况直接更包名就即可
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.20</version>
</dependency>
JSON**.**parseObject() | 将JSON 解析为JSONObject |
---|---|
JSON**.parseArray(**text) | 将JSON 解析为JSONArray |
JSON**.parseObject(text,** User.class) | 将JSON 解析为Java 对象 |
JSON**.toJSONString(**data); | 将Java 对象序列化为JSON |
Java 对象转 Json字符串(序列化)
@Test
public void testToJSONString() {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
String string = JSON.toJSONString(teacher);
System.out.println(string);
}
Json字符串转Java 对象(反序列化)
@Test
public void testParseObject() {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
Teacher teacher = JSON.parseObject(str, Teacher.class);
System.out.println(teacher);
}
Jackson
Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。
Jackson优点很多:
- Jackson 所依赖的jar包较少,简单易用。
- 与其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比较快。
- Jackson 运行时占用内存比较低,性能比较好
- Jackson 有灵活的 API,可以很容易进行扩展和定制。
目前最新版本是2.9.4,Jackson 的核心模块由三部分组成:
- jackson-core 核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
- jackson-annotations 注解包,提供标准注解功能;
- jackson-databind 数据绑定包,提供基于”对象绑定” 解析的相关 API( ObjectMapper )和”树模型” 解析的相关 API(JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。
Java 对象转 Json字符串(序列化)
String writeValueAsString(Object value) | 1、用于将任何 Java 对象(如 POJO、List、Set、Map等)序列化为 json 字符串,如果对象中某个属性的值为 null,则默认也会序列化为 null;2、如果 value 为 null,返回序列化的结果也返回 null |
---|---|
byte[] writeValueAsBytes(Object value) | 将 java 对象序列化为 字节数组 |
writeValue(File resultFile, Object value) | 将 java 对象序列化并输出指定文件中 |
writeValue(OutputStream out, Object value) | 将 java 对象序列化并输出到指定字节输出流中 |
writeValue(Writer w, Object value) | 将 java 对象序列化并输出到指定字符输出流中 |
@Test
public void testWriteValueAsString() throws JsonProcessingException {
Teacher teacher = new Teacher();
Student student = new Student();
ArrayList<Student> students = new ArrayList<>();
student.setId(1001);
student.setName("SpringBoot");
student.setAge(20);
students.add(student);
teacher.setId(1);
teacher.setName("Spring");
teacher.setStudents(students);
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(teacher);
System.out.println(str);
}
Json字符串转Java 对象(反序列化)
T readValue(String content, Class valueType) | 1、从给定的 JSON 字符串反序列化为 Java 对象;2、content 为空或者为 null,都会报错 3、valueType 表示反序列化的结果对象,可以是任何 java 对象,比如 POJO、List、Set、Map 等等. |
---|---|
T readValue(byte[] src, Class valueType) | 将 json 内容的字节数组反序列化为 java 对象 |
T readValue(File src, Class valueType) | 将本地 json 内容的文件反序列化为 java 对象 |
T readValue(InputStream src, Class valueType) | 将 json 内容的字节输入流反序列化为 java 对象 |
T readValue(Reader src, Class valueType) | 将 json 内容的字符输入流反序列化为 java 对象 |
T readValue(URL src, Class valueType) | 通过网络 url 地址将 json 内容反序列化为 java 对象 |
@Test
public void readValue() throws JsonProcessingException {
String str = "{\"id\":1,\"name\":\"Spring\",\"students\":[{\"id\":1001,\"name\":\"SpringBoot\",\"age\":20}]}";
ObjectMapper objectMapper = new ObjectMapper();
Teacher teacher = objectMapper.readValue(str, Teacher.class);
System.out.println(teacher);
}
Json 字符串内容反序列化为 Json 节点对象
JsonNode readTree(String content) | 将 JSON 字符串反序列化为 JsonNode 对象,即 json 节点对象 |
---|---|
JsonNode readTree(URL source) | 对网络上的 json 文件进行反序列化为 json 节点对象 |
JsonNode readTree(InputStream in) | 对 json 文件输入流进行反序列化为 json 节点对象 |
JsonNode readTree(byte[] content) | 对 json 字节数组反序列化为 json 节点对象 |
JsonNode readTree(File file) | 将本地 json 文件反序列为为 json 节点对象 |
Java 对象与 Json 节点对象的转换
T convertValue(Object fromValue, Class toValueType) | 将 Java 对象(如 POJO、List、Map、Set 等)序列化为 Json 节点对象。 |
---|---|
T treeToValue(TreeNode n, Class valueType) | json 树节点对象转 Java 对象(如 POJO、List、Set、Map 等等),TreeNode 树节点是整个 json 节点对象模型的根接口。 |