`
xgbjmxn
  • 浏览: 269443 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

Java对象和JSON互转换利器-Gson

阅读更多
Java对象和JSON互转换利器-Gson .
2008-07-11 09:30 3182人阅读 评论(2) 收藏 举报
Gson这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
Gson User Guide
Gson: A library to convert Java Objects to JSON and vice-versa
Inderjeet Singh, Joel Leitch
Overview
Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson is an open-source project hosted at http://code.google.com/p/google-gson. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of. Goals for Gson
•Provide easy to use mechanisms like toString() and constructor (factory method) to convert Java to JSON and vice-versa
•Allow pre-existing unmodifiable objects to be converted to and from JSON
•Allow custom representations for objects
•Support arbitrarily complex objects
Using Gson
The primary class to use is Gson which you can just create by calling new Gson(). There is also a class GsonBuilder available that can be used to create a Gson instance with various settings like version control and so on. The Gson instance does not maintain any state while invoking Json operations. So, you are free to reuse the same object for multiple Json serialization and deserialization operations.
Primitives Examples
(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 false = gson.fromJson("[false]", Boolean.class); String str = gson.fromJson("[/"abc/"]", String.class); String anotherStr = gson.fromJson("/"abc/"", String.class);
Object Examples
class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";   private transient int value3 = 3;
} (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
Finer Points with Objects
•It is perfectly fine (and recommended) to use private fields
•There is no need to use any annotations to indicate a field is to be included for serialization and deserialization. All fields in the current class (and from all super classes) are included by default.
•If a field is marked transient, (by default) it is ignored and not included in the JSON serialization or deserialization.
•This implementation handles nulls correctly
◦While serialization, a null field is skipped from the output
◦While deserialization, a missing entry in JSON results in setting the corresponding field in the object to null
•If a field is synthetic, it is ignored and not included in JSON serialization or deserialization
•Fields corresponding to the outer classes in  inner classes, anonymous classes, and local classes are ignored and not included in serialization or deserialization
Array Examples
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
We also support multi-dimensional arrays, with arbitrarily complex element types
Collections Examples
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(collectionType, json); ints2 is same as ints Fairly hideous: note how we define the type of collection Unfortunately, no way to get around this in Java Collections Limitations
•Can serialize collection of arbitrary objects but can not deserialize from it
◦Because there is no way for the user to indicate the type of the resulting object
•While deserializing, Collection must be of a specific generic type
All of this makes sense, and is rarely a problem when following good Java coding practices
Built-in Serializers and Deserializers
Gson has built-in serializers and deserializers for commonly used classes whose default representation may be inappropriate. Here is a list of such classes:
1.java.net.URL to match it with strings like "http://code.google.com/p/google-gson/".
2.java.net.URI to match it with strings like "/p/google-gson/".
Custom Serialization and Deserialization
Sometimes default representation is not what you want. This is often the case when dealing with library classes (DateTime, etc). Gson allows you to register your own custom serializers and deserializers. This is done by defining two parts:
•Json Serialiers: Need to define custom serialization for an object
•Json Deserializers: Needed to define custom deserialization for a type
•Instance Creators: Not needed if no-args constructor is available
GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapter(MyType.class, new MySerializer());
gson.registerDeserializer(MyType.class, new MyDeserializer());
gson.registerInstanceCreator(MyType.class, new MyInstanceCreator());
Writing a Serializer
Here is an example of how to write a custom serializer for JodaTime DateTime class. private class DateTimeSerializer implements JsonSerializer<DateTime> {   public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context);     new JsonPrimitive(src.toString());   } } Gson calls toJson() when it runs into a DateTime object during serialization.
Writing a Deserializer
Here is an example of how to write a custom deserializer for JodaTime DateTime class. private class DateTimeDeserializer implements JsonDeserializer<DateTime> {   public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)       throws JsonParseException {     return new DateTime(json.getAsJsonPrimitive().getAsString());   } } Gson calls fromJson() when it needs to deserialize a JSON string fragment into a DateTime object Finer points with Serializers and Deserializers Often you want to register a single handler for all generic types corresponding to a raw type
•For example, suppose you have an "Id" class for Id representation/translation (i.e. an internal vs. external representation).
•Id<T> type that has same serialization for all generic types
◦Essentially write out the id value
•Deserialization is very similar but not exactly the same

◦Need to call "new Id(Class<T>, String)" which returns an instance of Id<T>
Gson supports registering a single handler for this. You can also register a specific handler for a specific generic type (say Id<RequiresSpecialHandling> needed special handling). The Type parameter for the toJson and fromJson contains the generic type information to help you write a single handler for all generic types corresponding to the same raw type
Writing an Instance Creator
While deserializing an Object, Gson needs to create a default instance of the class Well-behaved  classes that are meant for serialization and deserialization should have a no-argument constructor
•Doesn't matter whether public or private
Typically, Instance Creators are needed when you are dealing with a library class that does NOT define a no-argument constructor Instance Creator Example private class MoneyInstanceCreator implements InstanceCreator<Money> {
  public Money createInstance(Type type) {
    return new Money("1000000", CurrencyCode.USD);
  }
}
Type could be of a corresponding generic type
•Very useful to invoke constructors which need specific generic type information
•For example, if the Id class stores the class for which the Id is being created
Versioning Support
Multiple versions of the same object can be maintained by using @Since annotation. This annotation can be used on Classes, Fields and, in a future release, Methods.
JSON Field Naming Support
Gson supports some pre-defined field naming policies to convert the standard Java field names (i.e. camel cased names starting with lower case --- "sampleFieldNameInJava") to a Json field name (i.e. sample_field_name_in_java or SampleFieldNameInJava).  It also has an annotation based strategy to allows clients to define custom names on a per field basis.  Note, that the annotation based strategy has field name validation which will raise "Runtime" exceptions if invalid field name are provided as the annotation value. The following is an example of how to use both Gson naming policy features: private class SomeObject {   @SerializedName("custom_naming") private final String someField;   private final String someOtherField;   public SomeObject(String a, String b) {     this.someField = a;     this.someOtherField = b;   } }
SomeObject someObject = new SomeObject("first", "second");
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
String jsonRepresentation = gson.toJson(someObject);
System.out.println(jsonRepresentation);

======== OUTPUT ========
{"custom_naming":"first","SomeOtherField":"second"}
Issues in Designing Gson
See the Gson design document for a discussion of issues we faced while designing Gson. It also include a comparison of Gson with other Java libraries that can be used for Json conversion.
Future Enhancements to Gson
For the latest list of proposed enhancements and to suggest new ones, see the Issues section under the project website.
•Support JavaBeans properties alongwith fields
•For Objects with circular dependency, need to explore an alternate strategy instead of throwing error. For example, may be print null, or an id-ref kind of thing
•More strict validation
•Clean up String serialization and deserialization and make it use a custom Serializers and Deserializers
分享到:
评论

相关推荐

    Json转换利器Gson实例代码

    Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (http://blog.csdn.net/lk_blog/article/details/7685169) Json转换利器Gson之实例二-Gson注解和GsonBuilder ...

    gson 2.3.1 json转换利器

    Gson 2.3.1作为一款高效的JSON转换工具,其简洁的API和强大的功能使得在Java和Android项目中处理JSON数据变得简单。通过理解和熟练掌握Gson的用法,开发者可以更便捷地进行数据交换和存储,提升项目的开发效率。在...

    Json转换利器Gson实例代码,java对象或者list转换为json字符串

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。 java对象或者list转换为json字符串

    gson-jar的资源,处理json字符串请下载

    总结来说,Gson-jar资源是Java开发中处理JSON的利器,提供了方便、高效的序列化和反序列化功能,对于任何需要与JSON格式数据打交道的Java项目来说,都是不可或缺的工具。使用Gson,你可以轻松地在Java对象和JSON之间...

    gson-2.3.1.zip

    总结起来,Gson-2.3.1是一个用于Java和Android开发的JSON解析库,它提供了强大的功能,使得JSON与Java对象之间的转换变得简单。在Android应用中,可以利用它来处理服务器返回的JSON数据,或者将本地数据模型转换为...

    gson-2.7.jar包

    Gson-2.7.jar是Google提供的一款Java库,用于在Java对象和JSON数据之间进行映射。这个库使得在Java应用程序中处理JSON数据变得极其简单。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读...

    gson2.7.jar

    Gson是Google推出的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它的全名是Google Simple Data Binder...通过引入"gson2.7.jar",开发者可以轻松地在JSON和Java对象之间进行转换,极大地提高了开发效率。

    jsontools-core-1.7-sources.jar

    总结起来,`jsontools-core-1.7-sources.jar`是一个专注于Java和JSON数据转换的工具包,它提供了一套简单易用的API,帮助开发者轻松地在Java对象和JSON格式之间进行转换。尽管在当前的Java生态中,有许多其他的JSON...

    fast-json.zip

    FastJson的设计目标是提供快速、简单的方式来序列化和反序列化JSON数据,使开发者能够方便地在Java对象和JSON字符串之间进行转换。 二、核心功能 1. JSON字符串到Java对象的转换:FastJson提供了`parseObject()`...

    ezmorph-1.0.6

    《ezmorph-1.0.6:Java中的JSON转换利器》 在Java开发中,处理JSON数据是一项常见的任务。为了高效、便捷地进行JSON对象与Java对象之间的转换,开发者们通常会依赖一些库来实现这一功能。其中,“ezmorph-1.0.6”...

    com.alibaba.fastjson json解析工具包

    例如,你可以使用`JSON.parseObject()`方法将JSON字符串转换为Java对象,而`JSON.toJSONString()`则可以将Java对象转换为JSON字符串。 其次,`fastjson`支持多种类型的Java对象转换,包括基本类型、自定义类、集合...

    flash2316.rar

    Gson是Google推出的一个Java库,它能够将Java对象转换为JSON字符串,同时也能将JSON内容解析回等效的Java对象。在给定的“flash2316.rar”压缩包中,我们很可能会找到与使用Gson进行JSON操作相关的资源,如示例代码...

    Json jar包

    这些库提供了API,让开发者可以轻松地将Java对象转换为JSON字符串,或者从JSON字符串反序列化成Java对象。这个"Json jar包"可能是其中的一种,可能是Jackson或Gson的二进制形式,包含了所有必要的类和资源。 "META-...

    Json一键转Javabean工具

    JSON转换为JavaBean的过程通常包括以下步骤: 1. **解析JSON字符串**:工具首先需要解析输入的JSON字符串,将其解析成一个JSON对象结构。这通常通过JSON库来实现,如Jackson、Gson或Fastjson等。这些库提供了API,...

    JsonUtil工具类

    总结来说,JsonUtil工具类是Java开发中的利器,它简化了JSON与Java对象间的转换,使开发者能更专注于业务逻辑。通过合理利用Jackson库提供的功能,我们可以创建高效、可维护的代码,提高开发效率。在实际项目中,...

    jar包fastjson-1.2.75.zip

    2. **映射和转换**: Fastjson支持直接在JSON和Java对象之间进行映射,无需定义额外的映射代码。它可以自动识别Java类的字段并进行赋值,也可以将Java对象的所有属性转换为JSON。 3. **流式API**: 提供了流式API,...

    json格式数据解析工具类

    总的来说,这个“json格式数据解析工具类”是Java开发中处理JSON数据的一个利器,它简化了JSON数据的解析过程,让开发者能更专注于业务逻辑,而不是基础的数据转换工作。通过学习和熟练掌握这个工具类的使用,能够...

    Asy+httpcore+gson.zip

    **Gson** 是Google开发的一个Java库,用于在Java对象和JSON数据之间进行映射。它能够轻松地将JSON字符串转换为Java对象,反之亦然。Gson的强大之处在于其灵活性和深度,它可以处理复杂的数据结构,如嵌套对象和数组...

    json.org.jar

    此外,随着Java生态的发展,出现了许多其他JSON库,如Jackson、Gson、Fastjson等,它们提供了更丰富的功能和更高的性能。这些库可能更适合大型项目或者有特定需求的开发环境。因此,在选择JSON处理库时,应根据项目...

Global site tag (gtag.js) - Google Analytics