注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

Gson教程-序列化与反序列化基础操作 | Gson Tutorial - Serialization and Deserialization based operation  

2015-08-12 19:57:18|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Gson教程-序列化与反序列化基础操作 | Gson Tutorial - Serialization and Deserialization based operation - 傲风 - 0与1构筑世界,程序员创造时代
一、普通对象(POJO)
二、数组
    1、序列化
    2、反序列化
三、集合类
    1、序列化
    2、反序列化
四、参考资料

Gson是众多开源JSON类库中的一个,使用非常简单,使用toJson和fromJson方法可将JSON字符串和Java对象相互转换,主要的特性有:

  • 全面支持泛型。
  • Java对象不需要在源代码中增加注解就可以进行转换。
  • 转换时使用Java对象的字段,而非setter和getter方法。
  • 可自定义序列化和反序列化满足个性化需求,甚至编写自己的TypeAdapter改变底层的解析。

下面,通过几段代码展示Gson如何将Java中常用的POJO、数组和集合序列化成JSON字符串,并反序列化。

一、普通对象(POJO)

1、一个POJO类:Person,有两个属性:name和age。
源代码文件

/**
 * 简单的Java对象。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class Person {

    private String name;

    private int age;

    public Person() {
        // nothing
    }

    public Person(String name, int age) {
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

2、对Person进行序列化与反序列化。
源代码文件

/**
 * Java简单对象的序列化与反序列化。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class SimpleObjectSerialize {

    /**
     * 序列化:将Java对象转换成JSON字符串。
     */
    public void serialize(Person person) {
        Gson gson = new Gson();
        System.out.println( gson.toJson(person) );
    }

    /**
     * 反序列化:将JSON字符串转换成Java对象。
     */
    public void deserialize(String json) {
        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        System.out.println( person );
    }

    public static void main(String[] args) {
        SimpleObjectSerialize ss = new SimpleObjectSerialize();

        Person person = new Person("NieYong", 33);
        ss.serialize(person);

        String json = " {\"name\":\"AoFeng\",\"age\":32}";
        ss.deserialize(json);
    }

}

运行SimpleObjectSerialize,控制台输出如下信息:

{"name":"NieYong","age":33}
Person [name=AoFeng, age=32]

二、数组

1、序列化

将整型对象数组、字符串数组和对象数组序列化成JSON字符串。
源代码文件

/**
 * 数组的序列化与反序列化。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class ArraySerialize {

    public void serialize(Object[] arr) {
        Gson gson = new Gson();
        System.out.println( gson.toJson(arr) );
    }

    public static void main(String[] args) {
        ArraySerialize as = new ArraySerialize();

        // 整型对象数组
        Integer[] intArr = new Integer[3];
        intArr[0] = 9;
        intArr[1] = 7;
        intArr[2] = 5;
        as.serialize(intArr);

        // 字符串数组
        String[] names = new String[3];
        names[0] = "张三";
        names[1] = "李四";
        names[2] = "王五";
        as.serialize(names);

        // 对象数组
        Person[] persons = new Person[2];
        persons[0] = new Person("小明", 10);
        persons[1] = new Person("马丽", 9);
        as.serialize(persons);
    }

}

运行ArraySerialize,控制台输出如下信息:

[9,7,5]
["张三","李四","王五"]
[{"name":"小明","age":10},{"name":"马丽","age":9}]

2、反序列化

将JSON字符串反序列化成整型对象数组、字符串数组和对象数组。
源代码文件

/**
 * 数组的反序列化。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class ArrayDeserialize {

    public <T> T deserialize(String json, Class<T> claz) {
        Gson gson = new Gson();
        return gson.fromJson(json, claz);
    }

    public static void main(String[] args) {
        ArrayDeserialize ad = new ArrayDeserialize();

        // 整型数组
        String intArrJson = "[9,7,5]";
        int[] intArr = ad.deserialize(intArrJson, int[].class);
        System.out.println("---------- 整型数组 ----------");
        for (int i : intArr) {
            System.out.println(i);
        }

        // 字符串数组
        String strArrJson = "[\"张三\",\"李四\",\"王五\"]";
        String[] strArr = ad.deserialize(strArrJson, String[].class);
        System.out.println("---------- 字符串数组 ----------");
        for (String str : strArr) {
            System.out.println(str);
        }

        // 对象数组
        String objArrJson = "[{\"name\":\"小明\",\"age\":10},{\"name\":\"马丽\",\"age\":9}]";
        Person[] objArr = ad.deserialize(objArrJson, Person[].class);
        System.out.println("---------- 对象数组 ----------");
        for (Person person : objArr) {
            System.out.println(person);
        }
    }

}

运行ArrayDeserialize,控制台输出如下信息:

---------- 整型数组 ----------
9
7
5
---------- 字符串数组 ----------
张三
李四
王五
---------- 对象数组 ----------
Person [name=小明, age=10]
Person [name=马丽, age=9]

三、集合类

1、序列化

将List、Set和Map序列化成JSON字符串。
源代码文件

/**
 * 集合的序列化。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class CollectionsSerialize {

    public void serialize(Collection<?> c) {
        Gson gson = new Gson();
        System.out.println( gson.toJson(c) );
    }

    public void serialize(Map<?, ?> map) {
        Gson gson = new Gson();
        System.out.println( gson.toJson(map) );
    }

    public static void main(String[] args) {
        CollectionsSerialize cs = new CollectionsSerialize();

        // 整型List
        List<Integer> intList = new ArrayList<Integer>();
        intList.add(9);
        intList.add(8);
        intList.add(0);
        cs.serialize(intList);

        // 字符串Set
        Set<String> strSet = new HashSet<String>();
        strSet.add("Hello");
        strSet.add("World");
        strSet.add("Best");
        cs.serialize(strSet);

        // Map
        Map<String, Person> objMap = new HashMap<String, Person>();
        objMap.put("marry", new Person("马丽", 20));
        objMap.put("xiaomin", new Person("小明", 21));
        cs.serialize(objMap);
    }

}

运行CollectionsSerialize,控制台输出如下信息:

[9,8,0]
["Best","World","Hello"]
{"xiaomin":{"name":"小明","age":21},"marry":{"name":"马丽","age":20}}

2、反序列化

将JSON字符串反序列化成List、Set和Map对象。
源代码文件

/**
 * 集合的反序列化。
 * 
 * @author <a href="mailto:aofengblog@163.com">聂勇</a>
 */
public class CollectionDeserialize {

    public <T> T deserialize(String json, Type type) {
        Gson gson = new Gson();
        return gson.fromJson(json, type);
    }

    public static void main(String[] args) {
        CollectionDeserialize cd = new CollectionDeserialize();

        //整型List
        String intListJson = "[9,8,0]";
        List<Integer> intList = cd.deserialize( intListJson, 
                new TypeToken<List<Integer>>(){}.getType() );
        System.out.println("---------- 整型List ----------");
        for (Integer obj : intList) {
            System.out.println(obj);
        }

        // 字符串Set
        String strSetJson = "[\"Best\",\"World\",\"Hello\"]";
        Set<String> strSet = cd.deserialize( strSetJson, 
                new TypeToken<Set<String>>(){}.getType() );
        System.out.println("---------- 字符串Set ----------");
        for (String str : strSet) {
            System.out.println(str);
        }

        // Map
        String objMapJson = "{\"xiaomin\":{\"name\":\"小明\",\"age\":21},\"marry\":{\"name\":\"马丽\",\"age\":20}}";
        Map<String, Person> objMap = cd.deserialize( objMapJson, 
                new TypeToken<Map<String, Person>>(){}.getType() );
        System.out.println("---------- Map ----------");
        for (Entry<String, Person> entry : objMap.entrySet()) {
            System.out.println(entry);
        }
    }

}

运行CollectionDeserialize,控制台输出如下信息:

---------- 整型List ----------
9
8
0
---------- 字符串Set ----------
Best
World
Hello
---------- Map ----------
xiaomin=Person [name=小明, age=21]
marry=Person [name=马丽, age=20]

四、参考资料


<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2015年08月12日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(1551)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017