6、TypeAdapter适配器

在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"]
}

自定义的序列化与反序列化适配器成功。

猜你喜欢

转载自blog.csdn.net/u010502101/article/details/80555514