4、java对象与json序列化和反序列化进阶——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"]
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值