Gson简介
Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,也可以把JSON转换为Java对象。它是Google开发的开源库。
Gson的特点:
- 易于使用:Gson API提供了一个高级外观,以简化常用用例。 无需创建映射:Gson API为要序列化的大多数对象提供了默认映射。
- 性能:Gson相当快并且内存占用少。它适用于大型对象或系统。
- 干净的JSON:Gson创建了干净且紧凑的JSON结果,易于阅读。
- 无依赖关系:除JDK之外,Gson库不需要任何其他库。
- 开源:Gson库是开源的;它是免费提供的。
Gson的功能非常齐全,但是性能没有Fastjson快。
Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private int id;
//SerializedName 保留了前端、后台各自的命名习惯,
//下面注解的意思是两个属性(name_test、name)都中,
//出现任意一个时均可以得到正确的结果
@SerializedName(value = "name_test",alternate = {"name"})
private String name;
private int age;
}
使用注解后,属性name就变成了name_test,如果不加注解就是name。
对象转json字符串:
//对象转json字符串
private static String tojson() {
User user = new User(1,"中国1",100);
Gson gson = new Gson();
String str = gson.toJson(user);
System.out.println("对象转json字符串:" + str);
return str;
}
json字符串转对象:
private static void fromjson(){
String str = tojson();
Gson gson = new Gson();
User user = gson.fromJson(str,User.class);
System.out.println(user);
}
List转json:
private static String tojsonlist(){
User user = new User(1,"中国1",100);
User user2 = new User(2,"中国2",200);
User user3 = new User(3,"中国3",300);
List list = new ArrayList();
list.add(user);
list.add(user2);
list.add(user3);
Gson gson = new Gson();
String str = gson.toJson(list);
System.out.println(str);
return str;
}
json转list:
private static void formjsonlist(){
String str = tojsonlist();
Gson gson = new Gson();
List<User> list = gson.fromJson(str,new TypeToken<List<User>>(){}.getType());
for (User user : list){
System.out.println(user);
}
}
Set转json:
private static String tojsonset(){
User user = new User(1,"中国1",100);
User user2 = new User(2,"中国2",200);
User user3 = new User(3,"中国3",300);
Set set = new HashSet();
set.add(user);
set.add(user2);
set.add(user3);
set.add(user4);
Gson gson = new Gson();
String str = gson.toJson(set);
System.out.println(str);
return str;
}
json转set:
private static void formjsonset(){
String str = tojsonset();
gson = new GsonBuilder().setPrettyPrinting().create();
Set<User> set = gson.fromJson(str,new TypeToken<Set<User>>(){}.getType());
for (User user : set){
System.out.println(user);
}
}
还有另一种常用的注解 @Expose,@Expose提供了两个属性,且都有默认值(默认值是true),开发者可以根据需要设置不同的值。注意: 该注解在使用new Gson() 时是不会发生作用,必须和GsonBuilder的excludeFieldsWithoutExposeAnnotation()配合使用。
GsonBuilder是另一种Gson的创建方式。
Gson gson = new GsonBuilder()
//序列化null
//.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
//.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
//.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
//.generateNonExecutableJson()
//禁止转义html标签
//.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
//与@Expose配合使用
.excludeFieldsWithoutExposeAnnotation()
.create();
实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExposeEntity {
// @Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条
// @Expose(deserialize = true,serialize = false) //反序列化时生效
// @Expose(deserialize = false,serialize = true) //序列化时生效
// @Expose(deserialize = false,serialize = false) // 和不写注解一样
@Expose(deserialize = true,serialize = false) //反序列化时生效,序列化时不生效
private String expose;
@Expose
private String name;
@Expose
private int age;
}
序列化:
private static String tojson(){
Gson gson = new GsonBuilder()
//序列化null
//.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
//.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
//.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
//.generateNonExecutableJson()
//禁止转义html标签
//.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
//与@Expose配合使用
.excludeFieldsWithoutExposeAnnotation()
.create();
String str = gson.toJson(expose);
System.out.println(str);
return str;
}
由于注解的作用,序列化是没有expose字段属性
json日期格式的处理:
private static void datafomate(){
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Gson gson = builder.create();
}
判断json中是否有属性:
private static void haselement(){
String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
String propertyName = "name";
boolean isContains = false ;
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json1);
JsonObject jsonObj = element.getAsJsonObject();
isContains = jsonObj.has(propertyName);
}
判断字符串是否是json对象:
private static boolean jsonflag() {
boolean jsonFlag;
User user = new User(1,"全球",21);
try{
String str = new Gson().toJson(user);
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(str);
JsonObject jsonObj = element.getAsJsonObject();
jsonFlag = true;
}catch (Exception e){
jsonFlag = false;
}
return jsonFlag;
}
增加json中的属性:
private static void add(){
String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
String propertyName = "desc";
Object propertyValue = "json各种技术的调研";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json1);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json1 = jsonObj.toString();
System.out.println(json1);
}
修改json中的属性:
private static void update(){
String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
String propertyName = "name";
Object propertyValue = "json各种技术的调研";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json1);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json1 = jsonObj.toString();
System.out.println(json1);
}