Google Gson官方教程

英文官方文档:

https://sites.google.com/site/gson/gson-user-guide (自由门请到这篇文章中下载)

概述

Gson是一个Java库,可用于将Java对象转换为JSON表示。它也可以被用来将JSON字符串转换成一个等效的Java对象。Gson是一个开源项目托管在,Gson可以处理任意Java对象包括已存在的对象,这种处理你没有源代码。

Gson的目标Gson性能和可扩展性

这里有一些指标,我们获得了在台式机(双皓龙处理器,8 gb的内存,64位Ubuntu)运行许多其他东西一样的测试。你可以通过使用类PerformanceTest重新运行这些测试。

注意:删除disabled_前缀来运行这些测试。我们使用这个前缀,以防止我们每次运行junit测试运行这些测试。

使用Gson

主要的类使用Gson你可以创建通过调用新的Gson(),还有一个类GsonBuilder可用,可以用于创建一个Gson实例与版本控制等各种设置等等。Gson实例调用Json操作时不维持任何状态。所以,你可以自由地重用相同的对象为多个Json序列化和反序列化操作。

简单例子(Serialization)Gson gson = new Gson();gson.toJson(1);==> prints 1gson.toJson(“abcd”);==> prints “abcd”gson.toJson(new Long(10)); ==> prints 10int[] values = { 1 };gson.toJson(values);==> prints [1](Deserialization)int one = gson.fromJson(“1”, int.class);Integer one = gson.fromJson(“1”, Integer.class);Long one = gson.fromJson(“1”, Long.class);Boolean false = gson.fromJson(“false”, Boolean.class);String str = gson.fromJson(“\”abc\””, String.class);String anotherStr = gson.fromJson(“[\”abc\”]”, String.class);对象例子class BagOfPrimitives { private int value1 = 1; private String value2 = “abc”; private transient int value3 = 3; BagOfPrimitives() {// no-args constructor }}(Serialization)BagOfPrimitives obj = new BagOfPrimitives();Gson gson = new Gson();String json = gson.toJson(obj); ==> json is {“value1″:1,”value2″:”abc”}Note that you can not serialize objects with circular references since that will result in infinite recursion. (Deserialization)BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class); ==> obj2 is just like obj

小细节

这个实现正确处理nulls – 序列化时,跳过一个空字段的输出 -反序列化时,在JSON结果对象中失踪的条目设置相应的字段为null

如果一个字段是合成的,它将被忽略,而不是包含在JSON序列化或反序列化

字段对应于外部类的内部类,匿名类,和当地的类被忽略,而不是包含在序列化或反序列化嵌套类(包括内部类)

Gson可以快速容易的序列化静态嵌套类。 Gson也可以反序列化静态嵌套类。然而,Gson不能自动反序列化纯内部类,因为他们的无参构造函数也需要包含对象的引用,反序列化的时候不可用。你可以解决这个问题,使静态内部类或通过提供一个自定义InstanceCreator。这里有一个例子:

public class A { public String a;class B {public String b;public B() {// No args constructor for B} } }

注:class B不能被Gson(在默认情况下)序列化。 在B是个内部类的情况下,Gson不能反序列化{“b”:“abc”}到b类的一个实例。如果它被定义为静态类B Gson就已经能够反序列化为字符串。另一个解决方案是编写一个定制的实例创建者B。

A a; public InstanceCreatorForB(A a) {this.a = a; } public A.B createInstance(Type type) {return a.new B(); }}

以上是可能的,但不推荐。

数组的例子Gson gson = new Gson();int[] ints = {1, 2, 3, 4, 5};String[] strings = {“abc”, “def”, “ghi”};(Serialization)gson.toJson(ints);==> prints [1,2,3,4,5]gson.toJson(strings); ==> prints [“abc”, “def”, “ghi”](Deserialization)int[] ints2 = gson.fromJson(“[1,2,3,4,5]”, int[].class); ==> ints2 will be same as ints

同时支持多维数组,任意复杂的元素类型。

集合的例子Gson gson = new Gson();Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);(Serialization)String json = gson.toJson(ints); ==> json is [1,2,3,4,5](Deserialization)Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();Collection<Integer> ints2 = gson.fromJson(json, collectionType);ints2 is same as ints

相当可怕:注意我们定义集合的类型   不幸的是,Java中没有办法解决这个问题

集合的局限性

可以序列化任意对象的集合,但不能反序列化 -因为没有为用户显示生成的对象的类型

反序列化时,集合必须是一个特定的泛型类型

所有这一切是有道理的,良好的Java编码实践很少有问题。

泛型类型的序列化和反序列化却不去主动改变,而是放任它的生活态度。

Google Gson官方教程

相关文章:

你感兴趣的文章:

标签云: