【Gson】【2】Gson使用演示

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1290557

3、【原始类型演示】

(1)原始类型转换为JSON对象(序列化)

Gson gson = new Gson();

gson.toJson(1); // 转换后的JSON为1

gson.toJson("abcd"); // 转换后的JSON为"abcd"

gson.toJson(new Long(10)); //转换后的JSON为10

gson.toJson(new int[]{1, 2}); //转换后的JSON为[1, 2]

(2)JSON对象转换为原始类型(反序列化)

Gson gson = new Gson();

int one = gson.fromJson("1", int.class); // 转换后的Java原始类型值为1

Integer ten = gson.fromJson("10", Integer.class); // 转换后的Java原始类型值为10

Long five = gson.fromJson("5", Long.class); //转换后的Java原始类型值为5

Boolean b = gson.fromJson("false", Boolean.class); //转换后的Java原始类型值为false

String str = gson.fromJson("\"abc\"", String.class); //转换后的Java原始类型值为"abc"

String anotherStr = gons.fromJson("[\"abcdef\"]", String.class); //转换后的Java原始类型值为"abcdef"

4、【Java对象演示】

(1)Java对象转换为JSON对象(序列化)

public class BagOfPrimitives

{

    private int value1 = 1;

    private String value2 = "abc";

    private transient int value3 = 3;

BagOfPrimitives()

    {

    }

    public static void main(String[] args)

    {

         Gson gson = new Gson();

BagOfPrimitives obj = new BagOfPrimitives();

         String json = gson.toJson(obj);

         System.out.println(json); // 转换后的JSON为{"value1": 1, "value2":"abc"}

    }

}



细心的读者可能已发现transient修饰的字段没有转换为JSON


(2)JSON对象转换为Java对象(反序列化)

String json = "{\"value1\": 1, \"value2\": \"abc\", \"value3\": 8}";

BagOfPrimitives obj = gson.fromJson(json, BagOfPrimitives.class);



JSON结构中的value3尽管被赋值为8,但转换为BagOfPrimitives对象后value3的属性值依然为定义时的值。


5、【GSON可以把JSON转换为静态内部类,但不能转换所谓纯内部类】

例如:

public class A

{

   public String a = null;

   class B

   {

        public String b = null;

   }

   public static void main(String[] args)

   {

       Gson gson = new Gson();

       String json = "{\"b\": \"def\"}";

       A obj = gson.fromJson(json, A.class);

   }

}

在转换过程中会抛出“No-args constructor for class com.pwm.gson.A$B does not exist”异常。解析方法把内部类改为静态内部类,或者按异常信息“Register an InstanceCreator with Gson for this type to fix this problem”所示,用Gson为其提供一个内部实例创建器,但GSON强烈不建议使用此方法。

6、【数组演示】:

(1)数据转换为JSON对象(序列化)

Gson gson = new Gson();

int[] ints = {1, 2, 3, 4, 5};

String[] strings = {"abc", "def", "ghi"};

gson.toJson(ints); // 转换后的JSON为[1,2,3,4,5]

gson.toJson(strings); // 转换后的JSON为["abc","def","ghi"]

(2)JSON对象转换为数组(反序列化)

Gson gson = new Gson();

String arrays = "[1,2,3,4,5]";

int[] ints2 = gson.fromJson(arrays, int[].class); // 转换后的Java整型数组

String[] strs2 = gson.fromJson(arrays, String[].class);  //转换后的Java字符串数组

7、【集合演示】

(1)集合转换为JSON对象(序列化)

Gson gson = new Gson();

Collection<Integer> ints = new ArrayList<Integer>();

ints.add(new Integer(1));

ints.add(new Integer(11));

ints.add(new Integer(111));

gson.toJson(ints); // 转换后的JSON为[1,11,111]

(2)JSON对象转换为集合(反序列化)

Gson gson = new Gson();

String colJson = "[2, 22, 222]";

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

Collection<Integer> ints2 = gson.fromJson(colJson, collectionType); // 转换后的Java整数集合



GSON官方资料中关于集合有个限制声明:

  • 对于任意类型的对象总能序列化为JSON对象,但不能把它反序列化过来,因为对用户来讲没有通常办法决定返回值的类型
  • 当反序列化为JAVA对象时,必须为集合指定类型

8、【泛型演示】

当使用toJson(obj)时,GSON会调用obj.getClass()获取对象类型信息再进行序列化,类似地当调用fromJson(json, MyClass.class)时,GSON会根据类型信息很好地完成反序列化(把JSON转换为JAVA对象),但当对象是一个泛型时则玩不转了,因为GSON在序列化或反序列化时,JAVA的泛型类型会被擦除掉,从而GSON无法获取泛型对象信息,从而无法完成转换。

(1)举例:

class Foo<T>

{

   T value;

}

Gson gson = new Gson();

Foo<Bar> foo = new Foo<Bar>();

gson.toJson(foo); // 转换JSON对象会失败,它不能正确地序列化foo.value

gson.fromJson(json, foo.getClass()); // 转换JAVA对象会失败,它无法把foo.value作为 Bar反序列化

(2)解决办法

对于这个泛型可以通过TypeTokenrx是定正确的参数类型来解决这个问题,如下:

Type fooType = new TypeToken<Foo<Bar>>(){}.getType();

gson.toJson(foo, fooType);

gson.fromJson(json, fooType);

9、【任意类型集合演示】

有时候我们会处理混合类型的JSON数组,如["hello", 5, {name:"GREETINGS", source:"guest"}],这个数组中既有字符串"hello",又有数值5,同时还有对象{name:"GREETINGS", source:"guest"}

(1)转换为JSON对象(序列化)

很自然地想到把对象{name:"GREETINGS", source:"guest"}封装成一个JAVA对象

class Event

{

    private String name = null;

    private String source = null;

    Event(String name, String source)

    {

        this.name = name;

        this.source = source;

    }

}

此时可以使用集合进行处理了:

Collection collection = new ArrayList();

collection.add("hello");

collection.add(5);

collection.add(new Event("GREETINGS", "guest"));

对其进行测试,可以发现能成功地转换为JSON对象:

Gson gson = new gson();

gson.toJson(collection); // 转换后的JSON为["hello", 5, {name:"GREETINGS", source:"guest"}]

(2)转换为JAVA对象(反序列化)

把上面的JSON对象使用Collection collect = gson.fromJson(json, Collection.class)反序列化,遗憾的是它失败了,抛出“The JsonDeserializer com.google.gson.DefaultTypeAdapter$CollectionTypeAdater@a3bcc1 failed to deserialized json object ["hello", 5, {name:"GREETINGS", source:"guest"}] given the type interface java.util.Collection”

(3)解决办法

遇到此种问题通常有三种办法来解决,此处使用最为推荐的方法:使用GSON解析器的API解析数组元素,它可以对每个数组元素使用fromJson()来处理。

JsonParser parser = new JsonParser();

JsonArray array = parser.parse(json).getAsJsonArray();

String ss = gson.fromJson(array.get(0), String.class);

int ii = gson.fromJson(array.get(1), Integer.class);

Event ee = gson.fromJson(array.get(2), Event.class);

10、【空对象演示】

对于空字段GSON缺省行为会忽略掉,但当使用GsonBuilder序列化一个空字段时,Gson将增加一个JsonNull元素到JsonElement结构中,从而可实现空对象的序列化和反序列化,例如:

public class Foo

{

   private final String s;

   private final int i;

   public Foo()

   {

        this(null, 5);

   }

   public Foo(String s, int i)

   {

       this.s = s;

       this.i = i;

   }

}

使用Gson进行测试:

Gson gson = new Gson();

Foo foo = new Foo();

String json = gson.toJson(foo); //转换后的Json为{"i":5},把字符串s忽略掉了

json = gson.toJson(null);       // 转换后的Json为""空字符串

使用GsonBuilder进行测试:

Gson gson = new GsonBuilder().serializeNulls().create();

Foo foo = new Foo();

String json = gson.toJson(foo); //转换后的Json为{"s":null, "i":5}

json = gson.toJson(null);       //转换后的JSON为null

四、GSON的其它功能

   至此把GSON的大体功能已介绍完毕,除此之外还有像“版本支持”、“字段命名绑定”等没有做说明,这并影响对GSON的使用,更多的详情可参见其官网或附件。

   特别声明一点,在实际应用过程中JSON和JAVA相互间的转换,使用泛型的机率很大,曾在www.iteye.com上看过这么一个帖子,如何把下面的JSON对象转换为JAVA对象,请感兴趣的读者参见上面的讲述完成此JSON对象的转换。

[

   {

       "id": 1,

       "pid": 0,

       "name": "总部",

       "open": true,

       "list":[

                  {"id":2, "pid":1, "name":"研发部", "isParent":false, "open":false},

                  {"id":3, "pid":1, "name':"市场部", "isParent":false, "open":false},

                  {"id":4, "pid":1, "name":"开发部", "isParent":false, "open":false}

              ]

   }

]

本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1290557

时间: 2024-12-30 17:26:31

【Gson】【2】Gson使用演示的相关文章

【Gson】【3】实例演习

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1299025 [本文范围]: 本文并非JSON知识讲解资料,亦非GSON知识讲解资料,而是通过实例让开发人员了解通过Gson如何使Java对象和Json对象进行相互转换. [JSON参考资料]: Json快速入门:http://www.w3school.com.cn/json/index.asp Json官网

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的好用,今天我们为了博客的保质保量,也就不分开写,我们直接拿比较火的Gson和Fast-json来使用,末尾在进行一些分析 Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 一.各有千秋 两大解析库的东家都是巨头,一个来自于Google官方,一个来自阿里巴巴,我们这

Json转换神器之Google Gson的使用

这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考.至于Gson是干什么的,有什么优点,请各位同学自行百度.话不多说,切入正题: 1. 下载Gson的jar包,拷贝到项目的lib文件夹中,并将其加入到buildPath中.使用maven的同学,直接在pom中加入以下依赖即可: ? 1 2 3 4 5 <dependency> <groupId>com.google.code.gson</groupId> <ar

实用Gson进行json数据转换

gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段. 下面是一个简单的例子:     public class Person {                private String name;          private int age;                /**          * @return the name

Android网络之数据解析----使用Google Gson解析Json数据

[正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                                                                                 Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式,这使得Jso

java-加载GSON的时候出现EOF错误

问题描述 加载GSON的时候出现EOF错误 用GSON转换Json字符串为对象,从文件中加载字符串时: File f = new File(Environment.getExternalStorageDirectory() + File.separator + ""jsonTest""); BufferedReader br = new BufferedReader(new FileReader(f)); String Json = br.readLine(); b

Android学习笔记45之gson解析json_Android

JSON即JavaScript Object Natation, 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing

Android中gson、jsonobject解析JSON的方法详解_Android

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

Gson对Java嵌套对象和JSON字符串之间的转换

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识,请参考以下内容:http://json.org/json-zh.html 在服务器和客户端之间使用JSON数据格式进行通信,经常会涉及到JAVA对象和JSON字符串之间的转换.通常,我们可以使用一些JSON解析工具,例如:Gson,FastJson等.当然,我们也可以手动解析,只是会比较繁琐. 下面