项目地址:https://github.com/google/gson
<dependencies> <!-- Gson: Java to Json conversion --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> <scope>compile</scope> </dependency> </dependencies>
基本数据类型的解析
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
double d = gson.fromJson("\"99.99\"", double.class); //99.99
double dd = gson.fromJson("99.99", double.class); //99.99
boolean b = gson.fromJson("true", boolean.class); // true
String str = gson.fromJson("String", String.class); // String
基本数据类型的生成
Gson gson = new Gson();
String jsonNumber = gson.toJson(100); // 100
String jsonBoolean = gson.toJson(false); // false
String jsonString = gson.toJson("String"); //"String"
POJO类的生成与解析
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
json序列化和反序列化
Gson gson = new Gson();
User user = new User("码农",24);
String jsonString = gson.toJson(user); // {"name":"码农","age":24}
// gson有很强的解析能力,加不加双引号都能正常解析。
User user2 = gson.fromJson(jsonString, User.class); // User{name='码农', age=24}
属性重命名 @SerializedName 注解的使用
@SerializedName("email_address")
private String emailAddress;
// json字符串中的email字段或email_address字段会映射到java中的emailAddress字段。
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;
Gson中使用泛型
java的泛型是擦除的。java泛型编译成字节码,泛型会去掉,这样保证和老版本兼容。TypeToken提供了对泛型的支持。
Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
注:TypeToken
的构造方法是protected
修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType()
而不是 new TypeToken<List<String>>().getType()
在包外无法new一个protected修饰构造方法的实例,但可以new一个继承它的子类的实例。这里是new 一个继承自TypeToken类的匿名子类,子类的实现为{}。完全继承父类,这样就可以调用父类的方法了。
GsonBuilder用法
当我们在调试或需要导出完整的json串时或API接中要求没有值必须用Null时,我们需要配置gson。
Gson gson = new GsonBuilder()
.serializeNulls()
.create();
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
.generateNonExecutableJson()
//禁止转义html标签
.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
.create();
@Expose注解。
@Expose //
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效
@Expose(deserialize = false,serialize = false) // 和不写一样
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
gson.toJson(category);
基于版本
使用方法:当前版本(GsonBuilder中设置的版本) 大于等于@since的值时该字段导出,小于@until的值时该该字段导出。
基于访问修饰符。了解。
class ModifierSample {
final String finalField = "final";
static String staticField = "static";
public String publicField = "public";
protected String protectedField = "protected";
String defaultField = "default";
private String privateField = "private";
}
使用GsonBuilder.excludeFieldsWithModifiers
构建gson,支持int
形的可变参数,值由java.lang.reflect.Modifier
提供,下面的程序排除了privateField
、 finalField
和staticField
三个字段。
ModifierSample modifierSample = new ModifierSample();
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
.create();
System.out.println(gson.toJson(modifierSample));
// 结果:{"publicField":"public","protectedField":"protected","defaultField":"default"}