Gson提供了简单的toJson()
和fromJson()
方法来将Java对象转换为JSON。
toJson()
– JSON的Java对象
Gson gson = new Gson();
// 1. Java object to JSON file
gson.toJson(obj, new FileWriter("C:\\fileName.json"));
// 2. Java object to JSON string
String json = gson.toJson(obj);
fromJson()
– JSON到Java对象
Gson gson = new Gson();
// 1. JSON file to Java object
Object object = gson.fromJson(new FileReader("C:\\fileName.json"), Object.class);
// 2. JSON string to Java object
String json = "{'name' : 'mkyong'}";
Object object = gson.fromJson(json, Staff.class);
1.下载Gson
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
2. Java对象
供以后测试。
package com.mkyong;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Staff {
private String name;
private int age;
private String[] position; // array
private List<String> skills; // list
private Map<String, BigDecimal> salary; // map
//getters and setters
}
3. Java对象到JSON
3.1在Gson中,我们可以使用gson.toJson()
将Java对象转换为JSON。
package com.mkyong;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class GsonExample1 {
public static void main(String[] args) {
// pretty print
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Staff staff = createStaffObject();
// Java objects to String
String json = gson.toJson(staff);
//System.out.println(json);
// Java objects to File
try (FileWriter writer = new FileWriter("c:\\test\\staff.json")) {
gson.toJson(staff, writer);
} catch (IOException e) {
e.printStackTrace();
}
}
private static Staff createStaffObject() {
Staff staff = new Staff();
staff.setName("mkyong");
staff.setAge(35);
staff.setPosition(new String[]{"Founder", "CTO", "Writer"});
Map<String, BigDecimal> salary = new HashMap() {{
put("2010", new BigDecimal(10000));
put("2012", new BigDecimal(12000));
put("2018", new BigDecimal(14000));
}};
staff.setSalary(salary);
staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));
return staff;
}
}
输出量
{
"name": "mkyong",
"age": 35,
"position": [
"Founder",
"CTO",
"Writer"
],
"skills": [
"java",
"python",
"node",
"kotlin"
],
"salary": {
"2018": 14000,
"2012": 12000,
"2010": 10000
}
}
4. JSON到Java对象
4.1在Gson中,我们可以使用gson.fromJson
将JSON转换回Java对象。
package com.mkyong;
import com.google.gson.Gson;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class GsonExample2 {
public static void main(String[] args) {
Gson gson = new Gson();
try (Reader reader = new FileReader("c:\\test\\staff.json")) {
// Convert JSON File to Java Object
Staff staff = gson.fromJson(reader, Staff.class);
// print staff
System.out.println(staff);
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出量
Staff{name='mkyong', age=35, position=[Founder, CTO, Writer], skills=[java, python, node, kotlin], salary={2018=14000, 2012=12000, 2010=10000}}
5.漂亮的打印JSON
5.1默认的JSON输出是紧凑模式。
package com.mkyong;
import com.google.gson.Gson;
public class GsonExample3 {
public static void main(String[] args) {
// compact print
Gson gson = new Gson();
String[] lang = {"Java", "Node", "Kotlin", "JavaScript"};
String json = gson.toJson(lang);
System.out.println(json);
}
}
输出量
["Java","Node","Kotlin","JavaScript"]
5.2启用漂亮的打印。
package com.mkyong;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonExample4 {
public static void main(String[] args) {
// pretty print
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String[] lang = {"Java", "Node", "Kotlin", "JavaScript"};
String json = gson.toJson(lang);
System.out.println(json);
}
}
输出量
[
"Java",
"Node",
"Kotlin",
"JavaScript"
]
6.排除字段
在Gson中,有很多方法可以排除某些字段。
6.1默认情况下, transient
和static
字段将被排除。 我们可以通过excludeFieldsWithModifiers
覆盖默认值
如果我们只想排除静态字段。
import java.lang.reflect.Modifier;
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.STATIC)
.create();
如果我们要排除瞬态和静态字段,则默认为。
import java.lang.reflect.Modifier;
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT)
.create();
在此配置中,将包括静态和瞬态字段。
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers()
.create();
6.2通过@Expose
排除字段
@Expose
定义要从JSON序列化和反序列化中排除的字段。 要使用@Expose
,我们需要创建Gson对象,如下所示:
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
如果启用了.excludeFieldsWithoutExposeAnnotation()
模式,则将排除所有没有@Expose
字段。 例如,
import com.google.gson.annotations.Expose;
public class Staff {
@Expose(serialize = true, deserialize = true)
private String name;
@Expose
private int age;
@Expose(serialize = false, deserialize = true)
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
如果将上述Java对象转换为JSON,则输出将如下所示
{
"name": "mkyong",
"age": 35
}
6.3通过ExclusionStrategies
,注释,类型,字段名称等排除字段。Gson灵活。
自定义注释@ExcludeField
package com.mkyong;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ExcludeField {
}
一个ExclusionStrategy
用于定义应排除或跳过哪些字段。
package com.mkyong;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
public class CustomExclusionStrategy implements ExclusionStrategy {
private final Class<?> typeToSkip;
public CustomExclusionStrategy(Class<?> typeToSkip) {
this.typeToSkip = typeToSkip;
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
// if field name 'salary`, skip
if ("salary".equals(f.getName())) {
return true;
}
// if found @ExcludeField, skip
if (f.getAnnotation(ExcludeField.class) != null) {
return true;
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return (clazz == typeToSkip);
}
}
再次检查staff
对象。
public class Staff {
private String name;
private int age;
@ExcludeField
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
启用ExclusionStrategy
模式。
Gson gson = new GsonBuilder()
.setExclusionStrategies(new CustomExclusionStrategy(List.class)) // exclude all List fields.
.create();
输出,该示例中,字段名salary
, @ExcludeField
字段和List
类型字段将被排除。
{"name":"mkyong","age":35}
7.空对象支持
null
对象字段将被忽略。
package com.mkyong;
import com.google.gson.Gson;
public class GsonExample5 {
public static void main(String[] args) {
Gson gson = new Gson();
Staff staff = createStaffObject();
String json = gson.toJson(staff);
System.out.println(json);
}
private static Staff createStaffObject() {
Staff staff = new Staff();
staff.setName("mkyong");
staff.setAge(35);
return staff;
}
}
输出量
{"name":"mkyong","age":35}
显示空值。
Gson gson = new GsonBuilder().serializeNulls().create();
输出量
{"name":"mkyong","age":35,"position":null,"skills":null,"salary":null}
8. JSON字段命名支持
默认
public class Staff {
private String name;
输出量
{"name":"abc"}
具有@SerializedName
自定义字段名称
public class Staff {
@SerializedName("mkyong_name")
private String name;
输出量
{"mkyong_name":"abc"}
9.版本支持
import com.google.gson.annotations.Since;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Staff {
@Since(1.0)
private String name;
@Since(2.0)
private int age;
@Since(3.0)
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
在此示例中,将排除字段position
(版本3)。
Gson gson = new GsonBuilder()
.serializeNulls()
.setVersion(2.0) // version <= 2.0 will be included.
.create();
输出量
{"name":null,"age":0,"skills":null,"salary":null}
10.常见问题
一些常见的问题。
10.1使用TypeToken
将JSON数组转换为对象列表
package com.mkyong;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class GsonExample4 {
public static void main(String[] args) {
Gson gson = new Gson();
String json = "[{\"name\":\"mkyong\"}, {\"name\":\"laplap\"}]";
List<Staff> list = gson.fromJson(json, new TypeToken<List<Staff>>() {}.getType());
list.forEach(x -> System.out.println(x));
}
}
输出量
Staff{name='mkyong', age=0, position=null, skills=null, salary=null}
Staff{name='laplap', age=0, position=null, skills=null, salary=null}
10.2将JSON转换为Map
package com.mkyong;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.Map;
public class GsonExample5 {
public static void main(String[] args) {
Gson gson = new Gson();
String json = "{\"name\":\"mkyong\", \"age\":33}";
Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>() {}.getType());
map.forEach((x, y) -> System.out.println("key : " + x + " , value : " + y));
}
}
输出量
key : name , value : mkyong
key : age , value : 33.0
注意
阅读更多Gson用户指南