定义
GSON是谷歌提供的开源库,用来解析Json格式的数据
JAR包
gson-2.2.4.jar
主要API
Gson gson = new Gson();
gson.fromJson
gson.toJson
Gson的基本用法
基本数据类型与json相互转换
@Test
public void JsonAndCommonType(){
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
double d = gson.fromJson("\"99.99\"", double.class); //99.99
boolean b = gson.fromJson("true", boolean.class); // true
String str = gson.fromJson("String", String.class); // String
System.out.println("i:"+i+" d:"+d+" b:"+b+" str:"+str); //i:100 d:99.99 b:true str:String
String intJson = gson.toJson(100);
String doubleJson = gson.toJson(99.99);
String booleanJson = gson.toJson(false);
String stringJson = gson.toJson("String");
System.out.println("intJson:" + intJson + " doubleJson:" + doubleJson +" booleanJson:"+booleanJson+" stringJson:"+stringJson);
//intJson:100 doubleJson:99.99 booleanJson:false stringJson:"String"
}
简单Bean与json相互转换
Admin.java
class Admin{
private int id;
private String name;
private String emailAddress;
public Admin(){}
public Admin(int id, String name, String emailAddress) {
super();
this.id = id;
this.name = name;
this.emailAddress = emailAddress;
}
//省略getter/setter
}
测试:
@Test
public void SimpleBeanAndJson(){
Admin admin = new Admin();
Gson gson = new Gson();
String jsonStr = gson.toJson(admin);
System.out.println(jsonStr);
Admin admin2 = gson.fromJson(jsonStr, Admin.class);
System.out.println(admin2.getId()+" "+admin2.getName()+" "+admin2.getEmailAddress());
}
运行结果:
{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}
1 nowuseeme nowuseeme@xx.com
上述运行结果,若是想让序列化结果名称改变下,如emailAddress改为email或者email_address可在对应的Bean添加注解@SerializedName
进行属性重命名,即
@SerializedName(value="email_address")
private String emailAddress;
@SerializedName
还有个alternate
属性(jar包2.4版本及以上才有),反序列化转为bean时三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。
String jsonStr2 = "{\"id\":1,\"name\":\"nowuseeme\",\"email\":\"nowuseeme@xx.com\"}";
Admin admin2 = gson.fromJson(jsonStr2, Admin.class);
System.out.println(admin2.getId()+" "+admin2.getName()+" "+admin2.getEmailAddress());
//输出结果: 1 nowuseeme nowuseeme@xx.com
Gson的流式反序列化
自动方式
比较常用的流式反序列化自动方式的重载方法
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);
手动方式
手动的方式就是使用stream包下的JsonReader类来手动实现反序列化
@Test
public void readAsReader(){
String json = "{\"id\":\"1\",\"name\":\"nowu\",\"emailAddress\":\"nowuseeme@xx.com\"}";
Admin admin = new Admin();
JsonReader reader = new JsonReader(new StringReader(json));
try {
reader.beginObject(); // throws IOException
while (reader.hasNext()) {
String s = reader.nextName();
switch (s) {
case "id":
admin.setId(reader.nextInt());
break;
case "name":
admin.setName(reader.nextString()); //自动转换
break;
case "emailAddress":
admin.setEmailAddress( reader.nextString());
break;
}
}
reader.endObject(); // throws IOException
System.out.println("id:"+admin.getId()+" name:"+admin.getName()+" emailAddress:"+admin.getEmailAddress());
} catch (IOException e) {
e.printStackTrace();
}
}
Gson的流式序列化
自动方式
由于PrintStream
和Writer
都实现了Appendable
接口,即可
PrintStream printStream = System.out;
gson.toJson(Bean, printStream);
稍微改下简单对象和json的转换案例:
@Test
public void SimpleBeanAndJson(){
Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");
Gson gson = new Gson();
gson.toJson(admin,System.out);
}
//控制台打印结果:
{"id":1,"name":"nowuseeme","emailAddress":"nowuseeme@xx.com"}
手动方式
测试:
@Test
public void testJsonWriter(){
try {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
writer.beginObject() // throws IOException
.name("id").value("1")
.name("name").value("name")
.name("email").nullValue() //演示null
.endObject();
writer.flush(); // throws IOException
} catch (IOException e) {
e.printStackTrace();
}
}
运行结果:
{"id":"1","name":"name","email":null}
GsonBuilder
作用
GsonBuilder是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson。
Gson gson = new GsonBuilder()
//各种配置
.create(); //生成配置好的Gson
使用
使用GsonBuilder导出null值(Gson在默认情况下是不动导出值null的键的)、格式化输出、日期时间等
Gson gson = new GsonBuilder()
//序列化null
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
.generateNonExecutableJson()
//禁止转义html标签
.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
.create();
TypeAdapter
TypeAdapter
是Gson自2.0(源码注释上说的是2.1)开始版本提供的一个抽象类,用于接管某种类型的序列化和反序列化过程,包含两个注要方法 write(JsonWriter,T)
和 read(JsonReader)
其它的方法都是final
方法并最终调用这两个抽象方法。
注:TypeAdapter
以及 JsonSerializer
和 JsonDeserializer
都需要与 GsonBuilder.registerTypeAdapter
或GsonBuilder.registerTypeHierarchyAdapter
配合使用
AdminTypeAdapter.java
import java.io.IOException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class AdminTypeAdapter extends TypeAdapter<Admin>{
@Override
public Admin read(JsonReader jsonreader) throws IOException {
Admin admin = new Admin();
jsonreader.beginObject();
while (jsonreader.hasNext()) {
switch (jsonreader.nextName()) {
case "id":
admin.setId(jsonreader.nextInt());
break;
case "name":
admin.setName(jsonreader.nextString());
break;
case "emailAddress":
case "email_address":
case "email":
admin.setEmailAddress(jsonreader.nextString());
break;
}
}
jsonreader.endObject();
return admin;
}
@Override
public void write(JsonWriter jsonWriter, Admin admin) throws IOException {
jsonWriter.beginObject();
jsonWriter.name("id").value(admin.getId());
jsonWriter.name("name").value("管理员"+admin.getName());
jsonWriter.name("emailAddress").value(admin.getEmailAddress());
jsonWriter.endObject();
}
}
测试:
@Test
public void testTypeAdapter(){
Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");
Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new AdminTypeAdapter()).create();
gson.toJson(admin, System.out);
}
输出结果:
{"id":1,"name":"管理员nowuseeme","emailAddress":"nowuseeme@xx.com"}
JsonSerializer与JsonDeserializer
JsonSerializer
@Test
public void testSerializer(){
Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonSerializer<Admin>(){
@Override
public JsonElement serialize(Admin admin, Type type,JsonSerializationContext arg2) {
final JsonObject jsonObject = new JsonObject(); //集合数组用JsonArray
jsonObject.addProperty("id", admin.getId());
jsonObject.addProperty("name", admin.getName());
jsonObject.addProperty("admin_email", admin.getEmailAddress());
return jsonObject;
}
}).create();
Admin admin = new Admin(1,"nowuseeme","nowuseeme@xx.com");
gson.toJson(admin, System.out);
}
运行结果:
{"id":1,"name":"nowuseeme","admin_email":"nowuseeme@xx.com"}
JsonDeserializer
@Test
public void testDeserializer(){
Gson gson = new GsonBuilder().registerTypeAdapter(Admin.class, new JsonDeserializer<Admin>() {
@Override
public Admin deserialize(JsonElement jsonelement, Type type,
JsonDeserializationContext jsondeserializationcontext)throws JsonParseException {
Admin admin = new Admin();
JsonObject jsonObject = jsonelement.getAsJsonObject();
admin.setId(jsonObject.get("id").getAsInt());
admin.setName(jsonObject.get("name").getAsString());
admin.setEmailAddress(jsonObject.get("emailAddress").getAsString()+"23333");
return admin;
}
}).create();
String json = "{\"id\":\"1\",\"name\":\"nowuseeme\",\"emailAddress\":\"nowuseeme@xx.com\"}";
Admin admin = gson.fromJson(json, Admin.class);
System.out.println(admin.getEmailAddress()); //nowuseeme@xx.com23333
}
TypeAdapterFactory
@JsonAdapter注解
参考
http://www.jianshu.com/p/e740196225a4
http://www.jianshu.com/p/d62c2be60617
http://blog.csdn.net/chunqiuwei/article/details/49160321
http://blog.csdn.net/chunqiuwei/article/details/49401733
http://www.jianshu.com/p/fc5c9cdf3aab