在Gson中提供了TypeAdapter适配器用于处理java对象与json之间的不规则序列化与反序列化问题。
例如,有一json文件 “e:/person”,其内容为
{
"name" : "lzj",
"cars" : ["baoma", "audi"]
}
任务一:
把e:/person文件中的json字符串反序列化为java中的Person对象,
Person类为:
public class Person {
private String name;
private String car1;
private String car2;
/*省略set/get/toString方法*/
}
任务2:
把java中Person对象序列化为json字符串,并存储在e:/person2文件中
示例如下
首先自定义适配器MyTypeAdapter,继承自TypeAdapter
class MyTypeAdapter extends TypeAdapter<Person>{
@Override
public void write(JsonWriter out, Person person) throws IOException {
out.beginObject();
out.name("name");
out.value(person.getName());
out.name("cars");
out.beginArray();
out.value(person.getCar1());
out.value(person.getCar2());
out.endArray();
out.endObject();
}
/*json字符串转化为Person对象*/
@Override
public Person read(JsonReader in) throws IOException {
Person person = new Person();
in.beginObject();
while(in.hasNext()){
String tag = in.nextName();
if (tag.equals("name")) {
String name = in.nextString();
person.setName(name);
}
if (tag.equals("cars")) {
in.beginArray();
List<String> cars = new ArrayList<String>();
while(in.hasNext()){
cars.add(in.nextString());
}
person.setCar1(cars.get(0));
person.setCar2(cars.get(1));
in.endArray();
}
}
in.close();
return person;
}
}
序列化与反序列化的适配器创建好了,下面直接运用就可以了
public static void main(String[] args) throws IOException {
FileReader reader = null;
FileWriter writer = null;
try {
reader = new FileReader("e:/person");
writer = new FileWriter("e:/person2");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
GsonBuilder buider = new GsonBuilder();
buider.registerTypeAdapter(Person.class, new MyTypeAdapter());
Gson gson = buider.create();
/*json反序列化为java中的Person对象*/
JsonReader jsonReader = new JsonReader(reader);
Person person = gson.fromJson(jsonReader, Person.class);
System.out.println(person);
/*把java中Person对象序列化为json,保存在person2文件中*/
String json = gson.toJson(person);
System.out.println(json);
try {
writer.write(json);
} catch (IOException e) {
e.printStackTrace();
} finally {
writer.close();
}
}
运行程序,输出内容如下:
反序列化后的内容为:
Person [name=lzj, car1=baoma, car2=audi]
-------------------------------
序列化后的内容为:
{"name":"lzj","cars":["baoma","audi"]}
打开文件e:/person2,其内容显示
{
"name" : "lzj",
"cars" : ["baoma", "audi"]
}
自定义的序列化与反序列化适配器成功。