JSON(JavaScript Object Notation
) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
JSON 采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等),这些特性使JSON成为理想的数据交换语言。
引入GSON
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。
功能
- 提供简单的toJson()和fromJson()方法,将Java对象到JSON,反之亦然
- 允许将已有的不可修改的对象与JSON相互转换
- Java泛型的广泛支持
- 允许对象的自定义表示
- 支持任意复杂的对象(具有深层继承层次结构和泛型类型的广泛使用)
Maven
<dependencies>
<!-- Gson: Java to Json conversion -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
Gradle
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
创建 GSON
默认创建
Gson gson = new Gson()
指定创建
Gson gson = new GsonBuilder()
//自定义序列化或反序列化
.registerTypeAdapter(Id.class, new IdTypeAdapter())
//启用复杂的 Map 键序列化
.enableComplexMapKeySerialization()
//序列化空字段
.serializeNulls()
//设定时间格式
.setDateFormat(DateFormat.LONG)
//设定字段命名策略
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
//设定打印样式
.setPrettyPrinting()
//设定版本号
.setVersion(1.0)
//创建 GSON
//...
.create();
使用 GSON
对象实例
对象 User
/*
* File:User.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/08/31 10:18:31
*/
package com.ichochy.entity;
public class User {
private String name = "iChochy";
private int age = 35;
private String url = "https://ichochy.com";
//...
}
toJson 方法将对象转换成 JSON 字符串
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.ichochy.example.User;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象
Gson gson = new Gson();
//toJson 将对象转换成 JSON 字符串
String json = gson.toJson(new User());
//{"name":"iChochy","age":35,"url":"https://ichochy.com"}
System.out.println(json);
}
}
fromJson 方法将 JSON 字符串转换成对象
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.ichochy.example.User;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象
Gson gson = new Gson();
// JSON 字符串
String json = "{\"name\":\"MLeo\",\"age\":35,\"url\":\"https://ichochy.com\"}";
//fromJson 将 JSON 字符串转换成对象
User user = gson.fromJson(json,User.class);
//Name:MLeo
//Age:35
//URL:https://ichochy.com
}
}
集合实例
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ichochy.example.User;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象
Gson gson = new Gson();
//toJson 将集合转换成 JSON 字符串
List<User> data = new ArrayList<>();
data.add(new User());
data.add(new User());
String json = gson.toJson(data);
//[{"name":"iChochy","age":35,"url":"https://ichochy.com"},{"name":"iChochy","age":35,"url":"https://ichochy.com"}]
System.out.println(json);
//fromJson 将 JSON 字符串转换成集合
//通过 TypeToken 指定类型
List<User> users = gson.fromJson(json, new TypeToken<Collection<User>>(){}.getType());
System.out.println(users);
}
}
泛型实例 TypeToken
泛型对象 Result
/*
* File:Result.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/24 10:59:24
*/
package com.ichochy.entity;
public class Result<T> {
private String code = "0000";
private String message = "OK";
private T data;
//...
}
TypeToken 指定泛型
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ichochy.entity.Result;
import com.ichochy.entity.User;
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象
Gson gson = new Gson();
//toJson 将对象转换成 JSON 字符串
Result result = new Result();
List<User> data = new ArrayList<>();
data.add(new User());
data.add(new User());
result.setData(data);
String json = gson.toJson(result);
//{"code":"0000","message":"OK","data":[{"name":"iChochy","age":35,"url":"https://ichochy.com"},{"name":"iChochy","age":35,"url":"https://ichochy.com"}]}
System.out.println(json);
//fromJson 将 JSON 字符串转换成对象
//通过 TypeToken 指定类型
Result<List<User>> values = gson.fromJson(json, new TypeToken<Result<List<User>>>(){}.getType());
System.out.println(values);
}
}
SerializedName 注解重命名属性
属性添加注解SerializedName
,实现自定义属性名
对象 User
/*
* File:User.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 12:49:22
*/
package com.ichochy.entity;
import com.google.gson.annotations.SerializedName;
public class User {
@SerializedName("userName")
private String name = "iChochy";
private int age = 35;
private String url = "https://ichochy.com";
//...
}
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ichochy.entity.User;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象
Gson gson = new Gson()
String json = gson.toJson(new User());
/**
* {
* "userName": "iChochy",
* "age": 35,
* "url": "https://ichochy.com"
* }
*/
System.out.println(json);
}
}
FieldNamingPolicy 指定命名规则
配置GSON(setFieldNamingPolicy)
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();
枚举常量 | 枚举常量和描述 |
---|---|
IDENTITY | 字段名称不变 |
LOWER_CASE_WITH_DASHES | 字段名称从其驼峰式的形式修改为小写的字段名称,其中每个单词都用短划线(-)分隔 |
LOWER_CASE_WITH_DOTS | 字段名称从其驼峰大小写形式修改为小写的字段名称,其中每个单词都用点(.)分隔 |
LOWER_CASE_WITH_UNDERSCORES | 字段名称从其驼峰式的形式修改为小写的字段名称,其中每个单词都用下划线(_)分隔 |
UPPER_CAMEL_CASE | 字段名称的第一个字母在序列化为JSON格式时大写 |
UPPER_CAMEL_CASE_WITH_SPACES | 字段名称的第一个字母在序列化为JSON格式时大写,并且单词之间将用空格分隔 |
时间格式
配置GSON(setDateFormat)
Gson gson = new GsonBuilder().setDateFormat("yyy-MM-dd HH:mm:ss").create();
/*
* File:Example.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/12/22 11:48:22
*/
package com.ichochy.gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Date;
public class Example {
public static void main(String[] args) {
//创建 GSON 对象,指定时间格式
Gson gson = new GsonBuilder().setDateFormat("yyy-MM-dd HH:mm:ss").create();
String json = gson.toJson(new Date());
//2020-12-24 11:40:45
System.out.println(json);
//fromJson 将 JSON 字符串转换成对象
//通过 TypeToken 指定类型
Date values = gson.fromJson(json, Date.class);
//Thu Dec 24 11:40:45 CST 2020
System.out.println(values);
}
}
Expose 注解显示属性
配置GSON(excludeFieldsWithoutExposeAnnotation)
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation.create();
属性添加注解 Expose,显示属性
package com.ichochy.entity;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class User {
@Expose
private String name = "iChochy";
private int age = 35;
private String url = "https://ichochy.com";
//...
}
Since 注解版本支持
配置GSON(setVersion)
Gson gson = new GsonBuilder().setVersion(1.0).create();
属性添加注解 Since,添加版本
package com.ichochy.entity;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class User {
@Since(1.1)
private String name = "iChochy";
@Since(1.0)
private int age = 35;
private String url = "https://ichochy.com";
//...
}
注: 高版本会显示低版本信息