gson java文档_Gson使用指南

泛型:

Gson使用指南

概览

Gson的目标

Gson性能和可扩展性

Gson用户

使用Gson(这里指的是android)

在Gradle/Android中使用Gson

例子

对象实例

对象细节

嵌套类(包括内部类)

数组示例

集合示例

序列化和反序列化泛型类型

任意类型对象集合的序列化和反序列化

内置的序列化器和反序列化器

自定义序列化和反序列化

编写序列化程序

编写反序列化程序

编写实例创建器

紧凑型 vs JSON的漂亮输出格式

空对象支持

版本控制支持

从序列化和反序列化中排除字段

JSON字段命名支持

在自定义序列化和反序列化之间共享状态

设计Gson的问题

Gson的未来改进

概览

Gson是一个Java库,可用于将Java对象转换为其JSON表示。还可以用于将JSON字符串转换为等效的Java对象。

Gson可以处理任意Java对象,包括没有在代码中预设的对象。

Gson的目标

提供易于使用的机制,如toString()构造函数(工厂方法),将Java转换为JSON,反之亦然

允许将预先存在的不可修改对象转换为JSON或从JSON转换

允许对象的自定义表示

支持任意复杂的对象

生成紧凑且可读的JSON输出

Gson性能和可扩展性

Gson用户

Gson的使用

要使用的主要类是Gson,可以通过调用创建的new Gson()以及GsonBuilder类用于创建具有各种设置(如版本控制等)的Gson实例。

在调用Json操作时,Gson实例不维护任何状态。因此,您可以重用相同的Gson对象自由地为多个Json进行序列化和反序列化操作。

在Gradle/Android中使用Gson

dependencies {

implementation 'com.google.code.gson:gson:2.8.5'

}

具体版本请参照网站

https://github.com/google/gson

例子:

// 序列化

Gson gson = new Gson();

gson.toJson(1); // ==> 1

gson.toJson("abcd"); // ==> "abcd"

gson.toJson(new Long(10)); // ==> 10

int[] values = { 1 };

gson.toJson(values); // ==> [1]

// 反序列化

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{

// 无参构造

}

}

// 序列化

BagOfPrimitives obj = new BagOfPrimitives();

Gson gson = new Gson();

String json = gson.toJson(obj);

// ==> json 内容是 {"value1":1,"value2":"abc"}

// 反序列化

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

// ==> obj2 是一个像 obj 的对象

对象细节:

最好使用private修饰字段

无需使用任何注释来指示要进行序列化和反序列化的字段。默认情况下当前类(包括所有从父类继承)的所有字段都会被包含

如果一个字段被transient修饰了,则在序列化和反序列化的过程会被忽略

Gson实现会正确处理空值

当序列化时,一个为空的字段将被忽略

当反序列化时,在反序列化时,JSON中缺少的条目导致将对象中的相应字段设置为其默认值:对象类型为null,数字类型为零,布尔值为false。

如果字段是合成的,则会被忽略,并且不包含在JSON序列化或反序列化中。

内部类,匿名类和本地类的字段会被忽略并且不被包含在序列化和反序列化中

嵌套类(包括内部类)

Gson能够地序列化和反序列化静态嵌套类。但是单纯的内部类不能被Gson序列化和反序列化,因为再反序列的时候需要一个实例的引用去获得实际的类型,你可以通过使用静态内部类或为其提供自定义InstanceCreator来解决此问题,如:

public class A {

public String a;

class B {

public String b;

public B() {

// B的无参构造

}

}

}

注意:上述的类B不能被Gson序列化。

可以通过定义B为静态内部类,来让Gson实现序列化和反序列化,如:

public class A {

public String a;

static class B {

public String b;

public B() {

// B的无参构造

}

}

}

也可以通过一个自定义的creator来解决,如:

public class InstanceCreatorForB implements InstanceCreator {

private final A a;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值