Gson框架实例

package com.json;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
 * 本文参考:
 http://blog.csdn.net/lk_blog/article/details/7685190
 *
 */
public class JsonDemo {

    private List<Person> personList;
    private Person personDemo;
    private Gson gson;

    public void initPersonData() {
        personDemo = new Person("我是demo", 40, "中国", new Date());
        Person p1 = new Person("张三", 20, "北京", new Date());
        Person p2 = new Person("李四", 22, "上海", new Date());
        Person p3 = new Person("王五", 30, "广州", new Date());
        personList = new ArrayList<Person>();
        personList.add(personDemo);
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);
    }

    public static void main(String[] args) {

        JsonDemo demo = new JsonDemo();

        int testType = 5;
        switch (testType) {
        case 1: // 简单对象转化和带泛型的List转化

            demo.initPersonData();
            demo.gson = new Gson();
            demo.printPersonResult();
            break;

        case 2: // Gson注解和GsonBuilder

            demo.initPersonData();
            // 注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson();
            demo.gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() // 不导出实体中没有用@Expose注解的属性
                    .enableComplexMapKeySerialization() // 支持Map的key为复杂对象的形式
                    .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")// 时间转化为特定格式
                    .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)// 会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
                    .setPrettyPrinting() // 对json结果格式化.
                    .setVersion(1.0) // 有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
                                        // @Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
                                        // @Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
                    .create();

            demo.printPersonResult();
            break;

        case 3:// Gson之实例-Map处理
            demo.testMap1();
            break;

        case 4:// Map处理
            demo.testMap2();
            break;

        case 5:// Map处理
            demo.testMap3();
            break;
        }

    }

    public void testMap1() {
        Map<Point, String> map1 = new LinkedHashMap<Point, String>();// 使用LinkedHashMap将结果按先进先出顺序排列
        map1.put(new Point(3, 6), "p1");
        map1.put(new Point(4, 8), "p2");
        gson = new GsonBuilder().enableComplexMapKeySerialization().create();
        String str = gson.toJson(map1);
        System.out.println(str);// 结果:[[{"x":3,"y":6},"p1"],[{"x":4,"y":8},"p2"]]

        Map<Point, String> retMap = gson.fromJson(str, new TypeToken<Map<Point, String>>() {
        }.getType());
        for (Point p : retMap.keySet()) {
            System.out.println("key:" + p + ",values:" + retMap.get(p));
        }
        System.out.println(retMap);
    }

    public void testMap2() {
        Map<String, Point> map1 = new LinkedHashMap<String, Point>();// 使用LinkedHashMap将结果按先进先出顺序排列
        map1.put("a", new Point(3, 6));
        map1.put("b", new Point(4, 8));
        gson = new GsonBuilder().enableComplexMapKeySerialization().create();
        String str = gson.toJson(map1);
        System.out.println(str);// 结果:[[{"x":3,"y":6},"p1"],[{"x":4,"y":8},"p2"]]

        Map<String, Point> retMap = gson.fromJson(str, new TypeToken<Map<String, Point>>() {
        }.getType());
        for (String p : retMap.keySet()) {
            System.out.println("key:" + p + ",values:" + retMap.get(p));
        }
        System.out.println(retMap);
    }

    public void testMap3() {
        initPersonData();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("persons", personList);

        List<Point> pointList = new ArrayList<Point>();
        pointList.add(new Point(3, 6));
        pointList.add(new Point(4, 6));
        pointList.add(new Point(4, 7));
        map.put("points", pointList);

        gson = new Gson();
        String str = gson.toJson(map);
        System.out.println(str);// 结果:{"persons":[{"name":"我是demo","age":40,"address":"中国","bir":"Aug
                                // 1, 2015 1:59:39
                                // PM"},{"name":"张三","age":20,"address":"北京","bir":"Aug
                                // 1, 2015 1:59:39
                                // PM"},{"name":"李四","age":22,"address":"上海","bir":"Aug
                                // 1, 2015 1:59:39
                                // PM"},{"name":"王五","age":30,"address":"广州","bir":"Aug
                                // 1, 2015 1:59:39
                                // PM"}],"points":[{"x":3,"y":6},{"x":4,"y":6},{"x":4,"y":7}]}

        Map<String, Object> retMap = gson.fromJson(str,
                new TypeToken<Map<String, List<Object>>>() {
                }.getType());  

        for(String key:retMap.keySet()){
            if("persons".equals(key)){
                 List<Person> pList = (List<Person>)retMap.get(key);
                 System.out.println(pList);
            }else if("points".equals(key)){
                 List<Point> pList = (List<Point>)retMap.get(key);
                 System.out.println(pList);
            }
        }

    }

    private void printPersonResult() {
        System.out.println("============简单对象的转化==============");
        String p1json = gson.toJson(personDemo);
        System.out.println(p1json);
        Person refPerson = gson.fromJson(p1json, Person.class);
        System.out.println(refPerson);
        System.out.println("");

        System.out.println("============带泛型的List的转化==============");
        String jsonStr = gson.toJson(personList);
        System.out.println("jsonStr:" + jsonStr);

        List<Person> reflist = gson.fromJson(jsonStr, new TypeToken<List<Person>>() {
        }.getType());

        for (Person per : reflist) {
            System.out.println(per);
        }
    }
}
时间: 2024-10-08 00:15:48

Gson框架实例的相关文章

【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)

(一).前言: 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制.本系列文章会包括到以下三个部分: RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类(点击进入) RecyclerView控件的实战实例(点击进入) RecyclerView控件集合AA

缓冲运动之框架開始一级简单框架实例

***********************缓冲运动[框架開始]-1.html********************************************* <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"

[读后感]spring Mvc 教程框架实例以及系统演示下载

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 不要好意思,昨晚写的,睡着忘发了,后附是篇好文,赶紧w分享一下. 感脚着,俺好像做了件聪明事儿,却不知会不会遭到不理解. 转载的好文,是不会推荐到

缓冲运动之框架开始一级简单框架实例

***********************缓冲运动[框架开始]-1.html********************************************* <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"

从零开始学android开发-Json转换利器Gson之实例

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: public class Student { private int id; private String name; private Date birthDay; public int

基于Python的接口测试框架实例

文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter.SoupUI等学习周期有点长,干脆自己写一个吧,不求人,所有功能自己都能一清二楚. 当然,写工具造轮子只是

Spring MVC框架实例

Spring  MVC 背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架.通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术.S

Json转换利器Gson之实例二-Gson注解和GsonBuilder

有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json. 有时候我们的实体类会随着版本的升级而修改. 有时候我们想对输出的json默认排好格式. ... ... 请看下面的例子吧: 实体类: [java] view plaincopy import java.util.Date; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public 

Json转换利器Gson之实例一-简单对象转化和带泛型的List转化

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: [java] view plaincopy [java] view plaincopy public class Student { private int id; private Str