gson生成jsonobject_GSON实现Java对象与JSON格式对象相互转换的完全教程

Gson是一个Java库,用来实现Json和Java对象之间的相互转换。Gson是一个托管在https://github.com/google/gson的开源项目。

Gson中主要的类是Gson,也可以使用类GsonBuilder在创建Gson对象的同时设置一些选项。

Gson对象在处理Json时不会保存任何状态,所以使用者能够很轻松的对同一个Gson对象进行多次序列化、反序列化等操作。

示例:基本使用

//Serialization

Gson gson = new Gson();

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

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

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

int[] 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 f = gson.fromJson("false", Boolean.class);

String str = gson.fromJson("\"abc\"", String.class);

String anotherStr = gson.fromJson("[\"abc\"]", String.class);

//Serialization

BagOfPrimitives obj = new BagOfPrimitives();

Gson gson = new Gson();

String json = gson.toJson(obj);

//==> json is {"value1":1,"value2":"abc"}

示例:对象与Json之间转换

定义BagOfPrimitives类:

class BagOfPrimitives {

private int value1 = 1;

private String value2 = "abc";

private transient int value3 = 3;

BagOfPrimitives() {

// no-args constructor

}

}

序列化为Json:

//Serialization

BagOfPrimitives obj = new BagOfPrimitives();

Gson gson = new Gson();

String json = gson.toJson(obj);

//==> json is {"value1":1,"value2":"abc"}

不要序列化含有循环引用的对象,否则会造成无限的递归。

反序列化:

//Deserialization

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

//==> obj2 is just like obj

处理对象时的一些细节:

推荐使用私有字段(译者:可以通过反射获取私有字段的名称和值)

没有必要使用标注指明哪些字段该被序列化或者反序列化。在当前类(也包括其父类)中的所有字段都默认会被序列化/反序列化。

如果某字段在声明时使用了关键字transient,默认情况下不会被序列化/反序列化。

Gson如下处理null字段:

序列化时候null字段会被跳过

反序列化时,类中有但Json中没有的字段将设值为null。

synthetic字段不会被序列化/反序列化。

在外部类(outer classes)中的内部类(inner classes)、匿名类(anonymous classes)和局部类(local classes)中的字段不会被序列化/反序列化。

嵌套类(包括内部类)的处理

Gson可以很轻松地序列化嵌套类,且能够反序列化静态的嵌套类。Gson无法自动地反序列化纯粹的内部类,是因为内部类的无参构造函数需要引用包含它的对象(即外部类的实例)。要反序列化静态类,可以将内部类静态化或者提供一个自定义的实例创造器(instance creator)。下面是一个示例:

public class A {

public String a;

class B {

public String b;

public B() {

// No args constructor for B

}

}

}

上面的类B无法被Gson序列化。由于类B是一个(非静态的)内部类,Gson也无法反序列化{"b":"abc"}到类B的实例中。如果B被声明为static class B,那么Gson就能对这个字符串反序列化了。

另外一个解决方法是为B写一个实例创建器:

public class InstanceCreatorForB implements InstanceCreator {

private final 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值