Gson(A Java serialization/deserialization library to convert Java Objects into JSON and back)
是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
1. Gson Goals
-
- 提供简单的
toJson()
和fromJson()
方法的Java对象转换为JSON,反之亦然 - 允许将先前存在的不可修改对象转换为JSON或从JSON转换
- 广泛的Java泛型支持
- 允许对象的自定义表示
- 支持任意复杂的对象(具有深层继承层次结构和泛型类型的广泛使用)
- 提供简单的
2. GSON生成JSON数据
2.1 首先在pom.xml加入依赖(Maven创建)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency>
2.2 为JavaBean实例赋值之后,生成Gson对象,并利用toJson(object)方法将数据转换为json格式
import com.google.gson.Gson; public class GsonCreateSimple { public static void main(String[] args) { //1.创建Person对象,利用set()方法赋值 Person xiaofeng=new Person(); xiaofeng.setName("小峰"); xiaofeng.setAge(22.5); xiaofeng.setGirlfriend(true); xiaofeng.setMajor(new String[]{"唱歌","coding"}); //2.创建一个Gson对象,并利用toJson(object)方法将数据转换为json格式 Gson gson =new Gson(); System.out.println(gson.toJson(xiaofeng)); } }
输出Json格式:
2.3 修正的方法 tips
2.3.1 @SerializedName注解
有时需要在输出的Json数据中显示自己想要的效果而不能直接修改JavaBean属性名称时(比如上例想要将 "name" 转换为 “名字” 输出在控制台),可以在JavaBean类里想要转换的属性前加上该注解@SerializedName(“想要显示的内容”)。
上例:修改Person类,在属性“name”前加上注解
控制台输出:
2.3.2 GsonBuilder(用于对json数据美化,或者个性化输出)
public class GsonCreateSimple { public static void main(String[] args) { //1.创建Person对象,利用set()方法赋值 Person xiaofeng=new Person(); xiaofeng.setName("小峰"); xiaofeng.setAge(22.5); xiaofeng.setGirlfriend(true); xiaofeng.setMajor(new String[]{"唱歌","coding"});
//2.创建一个Gson对象,并利用toJson(object)方法将数据转换为json格式 //Gson gson =new Gson(); GsonBuilder gsonBuilder=new GsonBuilder(); gsonBuilder.setPrettyPrinting(); //将json数据按层次格式输出,更直观,常用于调试 //为json数据输出添加逻辑 gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { public String translateName(Field field) { if(field.getName().equals("age")){ return "今年多大了啊:"; } return field.getName(); } });
Gson gson=gsonBuilder.create(); System.out.println(gson.toJson(xiaofeng)); } }
该demo将json数据结构化输出,并将属性 “age”个性化输出:
注意:输出json数据时,会将属性名输出,如果不想输出该属性,可在声明属性时使用transient修饰,这样即使赋值也不会输出了
private transient String ignore;
3. GSON 解析
JSONObject可以将*.json文件解析成一个它的对象;Gson可以正向的生成,也可以解析成自己定义的一个JavaBean的对象。
xiaofeng.json
{"birthday":"1999-11-22","girlfriend":"true","major":["sing","coding"],"school":"Qinghua University","car":null,"name":"小峰","comment":"JSON里不能直接使用注释,需要添加时可通过此方式。。","age":22}
解析demo:ReadGson.java
public class ReadGson { public static void main(String[] args) throws IOException {
// 获取本文件路径下的json文件 File file = new File(ReadJSON.class.getResource("/xiaofeng.json").getFile()); // 读取json文件内容 String content = FileUtils.readFileToString(file);
//生成Gson对象,利用其fromJson(String json,Class<T> class)方法来解析Json数据,生成JavaBean对象 Gson gson =new Gson(); Person xiaofeng=gson.fromJson(content, Person.class); //输出对象,此处JavaBean类有toString()方法,故可直接打印 System.out.println(xiaofeng); } }
注意:此处需要Person类的属性和解析的 xiaofeng.json内的 key相对应。
4. GSON解析特殊格式(相较于JSON的优势所在)
4.1 带日期转换
在JSON里Date格式需要设置为String类型,而在Gson里是可以忽略这个问题的
下面demo中,在 PersonByGson类里Birthday的属性为Date类型的,解析时再设置显示的格式
// 获取本文件路径下的json文件 File file = new File(ReadJSON.class.getResource("/xiaofeng.json").getFile()); // 读取json文件内容 String content = FileUtils.readFileToString(file); //生成Gson对象,利用其fromJson(String json,Class<T> class)方法来解析Json数据 //Gson gson =new Gson(); Gson gson =new GsonBuilder().setDateFormat("yyyy-MM-dd").create();//这里通过创建GsonBuild对象来设置格式 PersonByGson xiaofeng=gson.fromJson(content, PersonByGson.class); //输出日期 toLocaleString() System.out.println(xiaofeng.getBirthday().toLocaleString());
输出日期格式:
4.2 集合类解析
将JavaBean类中数组格式属性转换为List 集合属性(注意相应修改setXx()和getXx()和toString()方法)
直接输出(解析程序同上,自动匹配相应的ArrayList,属性是Set格式的话是LinkedHashSet):
5. 对JSON库作一总结:
功能:映射Java Object与json格式数据
1.通过Annotation注解来声明 2.支持自定义属性名称 3.支持包含或排除属性 4.支持自定义接口自己完成解析/生成过程
https://github.com/google/gson