- 浏览: 284625 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (142)
- android (64)
- android team 应用开发流程 (0)
- android 个人 开发流程 (1)
- android UI 切换皮肤 (1)
- java (9)
- 敏捷开发 (1)
- git (1)
- 学习 (2)
- hibernate (0)
- jQuery (1)
- windows (2)
- tomcat (1)
- Spring (3)
- struts2 (5)
- mysql (4)
- linux (15)
- JBPM (2)
- maven (4)
- 企业管理 (1)
- Iphone (1)
- 工作计划 (0)
- news (1)
- MOVE (1)
- exception-android (1)
- RFID (1)
- 测试 (7)
- android基础 (1)
- Gson (1)
- Android中的单元测试 (1)
最新评论
-
jlees:
Nice post.i hope this will help ...
Business mobile application development. The developer’s insight. -
weisi2375:
确实很详细的开发流程。
Android应用开发全流程 -
mikefather:
不错不错
Android,谁动了我的内存 -
ylzyd12345:
mark一下,谢谢分享
android的一些开源项目 -
limingcai:
确实不行,2.2就不行了,虽说2.3了 只有1.6可以
Android完全关闭应用程序
这个网页通过正常的手段是访问不到的, 为了大家能够方便的学习Gson。 因此将原文应用到此。
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 object
- Generate compact and readability JSON output
Gson Performance and Scalability
Here
are some metrics that we obtained on a desktop (dual opteron, 8GB RAM,
64-bit Ubuntu) running lots of other things along-with the tests. You
can rerun these tests by using the class
PerformanceTest
.- Strings: Deserialized strings of over 25MB without any problems (see
disabled_testStringDeserializationPerformance
method in
PerformanceTest
)
- Large collections:
- Serialized a collection of 1.4 million objects (see
disabled_testLargeCollectionSerialization
method inPerformanceTest
)
- Deserialized a collection of 87,000 objects (see disabled_testLargeCollectionDeserialization in PerformanceTest )
- Serialized a collection of 1.4 million objects (see
disabled_testLargeCollectionSerialization
method inPerformanceTest
)
- Gson 1.4 raised the deserialization limit for byte arrays and collection to over 11MB from 80KB.
Gson Users
Gson was originally created for use inside Google where it is currently used in a number of projects. It is now used by a number of public projects and companies. See details here .
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;
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
- 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
Nested Classes (including Inner Classes)
public class A {
public String a;
class B {
public String b;
public B() {
// No args constructor for B
}
}
}
G s o n c a n n o t d e serialize {"b":"abc"} into an instance of B since the class B is an inner class. if it was defined as static class B then Gson would have been able to deserialize the string. Another solution is to write a custom instance creator for B.
Array Examples
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};
(Serialization)
gson .toJson(ints); ==> prints [1,2,3,4,5]
(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 G son ();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
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
Serializing and Deserializing Generic Types
When you call toJson(obj) , Gson calls obj.getClass() to get information on the fields to serialize. Similarly, you can typically passMyClass.class object in the fromJson(json, MyClass.class) method. This works fine if the object is a non-generic type. However, if the object is of a generic type, then the Generic type information is lost because of Java Type Erasure. Here is an example illustrating the point:class Foo<T> {
gson.toJson(foo); // May not serialize foo.value correctly
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar
The above code fails to interpret value as type Bar because Gson invokes list.getClass() to get its class information, but this method returns a raw class, Foo.class . This means that Gson has no way of knowing that this is an object of type Foo<Bar>, and not just plain Foo.
You can solve this problem by specifying the correct parameterized type for your generic type. You can do this by using the TypeToken class.
Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);
gson.fromJson(json, fooType);
The idiom used to get fooType actually defines an anonymous local inner class containing a method getType() that returns the fully parameterized type.
Serializing and Deserializing Collection with Objects of Arbitrary Types
['hello',5,{name:'GREETINGS',source:'guest'}]
Collection collection = new ArrayList();
collection.add("hello");
collection.add(5);
collection.add(new Event("GREETINGS", "guest"));
class Event {
private String name;
private String source;
private Event(String name, String source) {
this.name = name;
this.source = source;
}
}
toJson(collection)
would write out the desired output.fromJson(json, Collection.class)
will
not work since Gson has no way of knowing how to map the input to the
types. Gson requires that you provide a genericised version of
collection type in fromJson. So, you have three options:
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:
- java.net.URL to match it with strings like "http://code.google.com/p/google-gson/".
- 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 or a deserializer is registered
gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter());
gson .registerTypeAdapter(MyType.class, new MySerializer());
gson .registerTypeAdapter(MyType.class, new MyDeserializer());
gson .registerTypeAdapter(MyType.class, new MyInstanceCreator());
registerTypeAdapter call checks if the type adapter implements more than one of these interfaces and register it for all of them.
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) {
return 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>
- Need to call
"new Id(Class<T>, String)"
which returns an instance of Id<T>
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 classWell-behaved classes that are meant for serialization and deserialization should have a no-argument constructor
- Doesn't matter whether public or private
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
InstanceCreator for a Parameterized Type
Sometimes that the type that you are trying to instantiate is a parameterized type. Generally, this is not a problem since the actual instance is of raw type. Here is an example:class MyList<T> extends ArrayList<T> {
}
class MyListInstanceCreator implements InstanceCreator<MyList<?>> {
@SuppressWarnings("unchecked")
public MyList<?> createInstance(Type type) {
// No need to use a parameterized list since the actual instance will have the raw type anyway.
return new MyList();
}
}
However, sometimes you do need to create instance based on the actual parameterized type. In this case, you can use the type parameter being passed to the createInstance method. Here is an example:
public class Id<T> {
private final Class<T> classOfId;
private final long value;
public Id(Class<T> classOfId, long value) {
this.classOfId = classOfId;
this.value = value;
}
}
class IdInstanceCreator implements InstanceCreator<Id<?>> {
public Id<?> createInstance(Type type) {
Type[] typeParameters = ((ParameterizedType)type).getActualTypeArguments();
Type idType = typeParameters[0]; // Id has only one parameterized type T
return Id.get((Class)idType, 0L);
}
}
In the above example, an instance of the Id class can not be created without actually passing in the actual type for the parameterized type. We solve this problem by using the passed method parameter, type . The type object in this case is the Java parameterized type representation ofId<Foo> where the actual instance should be bound to Id<Foo> . Since Id class has just one parameterized type parameter, T , we use the zeroth element of the type array returned by getActualTypeArgument() which will hold Foo.class in this case.
Compact Vs. Pretty Printing for JSON Output Format
The default JSON output that is provide by Gson is a compact JSON format. This means that there will not be any whitespace in the output JSON structure. Therefore, there will be no whitespace between field names and its value, object fields, and objects within arrays in the JSON output. As well, "null" fields will be ignored in the output (NOTE: null values will still be included in collections/arrays of objects). See the Null Object Support section for information on configure Gson to output all null values.If you like to use the Pretty Print feature, you must configure your Gson instance using the GsonBuilder . The JsonFormatter is not exposed through our public API, so the client is unable to configure the default print settings/margins for the JSON output. For now, we only provide a defaultJsonPrintFormatter that has default line length of 80 character, 2 character indentation, and 4 character right margin.
The following is an example shows how to configure a Gson instance to use the default JsonPrintFormatter instead of theJsonCompactFormatter :
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);
Null Object Support
The default behaviour that is implemented in Gson is that null object fields are ignored. This allows for a more compact output format; however, the client must define a default value for these fields as the JSON format is converted back into its Java.Here's how you would configure a Gson instance to output null:
Gson gson = new GsonBuilder().serializeNulls().create();
NOTE: when serializing null s with Gson, it will add a JsonNull element to the JsonElement structure. Therefore, this object can be used in custom serialization/deserialization.
Here's an example:
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 = new GsonBuilder().serializeNulls().create();
Foo foo = new Foo();
String json = gson.toJson(foo);
System.out.println(json);
json = gson.toJson(null);
System.out.println(json);
======== OUTPUT ========
{"s":null,"i":5}
null
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. In order to leverage this feature, you must configure your Gson instance to ignore any field/object that is greater than some version number. If no version is set on the Gson instance then it will serialize and deserialize all fields and classes regardless of the version.public class VersionedClass {
@Since(1.1) private final String newerField;
@Since(1.0) private final String newField;
private final String field;
public VersionedClass() {
this.newerField = "newer";
this.newField = "new";
this.field = "old";
}
}
VersionedClass versionedObject = new VersionedClass();
Gson gson = new GsonBuilder().setVersion(1.0).create();
String jsonOutput = gson.toJson(someObject);
System.out.println(jsonOutput);
System.out.println();
gson = new Gson();
jsonOutput = gson.toJson(someObject);
System.out.println(jsonOutput);
======== OUTPUT ========
{"newField":"new","field":"old"}
{ "newerField":"newer", "newField":"new","field":"old"}
Excluding Fields From Serialization and Deserialization
Gson supports numerous mechanisms for excluding top-level classes, fields and field types. Below are pluggable mechanism that allow field and class exclusion. If none of the below mechanism satisfy your needs then you can always use custom serializers and deserializers .
Java Modifier Exclusion
By default, if you mark a field as transient , it will be excluded. As well, if a field is marked as "static" then by default it will be excluded. If you want to include some transient fields then you can do the following:import java.lang.reflect.Modifier;
Gson gson = new GsonBuilder()
.excludeFieldsWithModifier(Modifier.STATIC)
.create();
NOTE: you can use any number of the Modifier constants to "excludeFieldsWithModifier " method. For example:
Gson gson = new GsonBuilder()
.excludeFieldsWithModifier(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE)
.create();
Gson's @Expose
This
feature provides a way where you can mark certain fields of your
objects to be excluded for consideration for serialization and
deserialization to JSON. To use this annotation, you must create Gson by
using
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
. The Gson instance created will exclude all fields in a class that are not marked with
@Expose
annotation.
User Defined Exclusion Strategies
If
the above mechanisms for excluding fields and class type do not work
for you then you can always write your own exclusion strategy and plug
it into Gson. See the
ExclusionStrategy
JavaDoc for more information.
The
following example shows how to exclude fields marked with a specific
"@Foo" annotation and excludes top-level types (or declared field type)
of class String.
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Foo {
// Field tag only annotation
}
public class SampleObjectForTest {
@Foo
private final int annotatedField;
private final String stringField;
private final long longField;
private final Class<?> clazzField;
public SampleObjectForTest() {
annotatedField = 5;
stringField = "someDefaultValue";
longField = 1234;
}
}
public class MyExclusionStrategy implements ExclusionStrategy {
private final Class<?> typeToSkip;
private MyExclusionStrategy(Class<?> typeToSkip) {
this.typeToSkip = typeToSkip;
}
public boolean shouldSkipClass(Class<?> clazz) {
return (clazz == typeToSkip);
}
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(Foo.class) != null;
}
}
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy(String.class))
.serializeNulls()
.create();
SampleObjectForTest
src = new SampleObjectForTest();
String json = gson.toJson(src);
System.out.println(json);
}
======== OUTPUT ========
{"longField":1234}
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). See the FieldNamingPolicy class for information on the pre-defined naming policies.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 an invalid field name is 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"}
Sharing State Across Custom Serializers and Deserializers
- Store shared state in static fields
- Declare the serializer/deserializer as inner classes of a parent type, and use the instance fields of parent type to store shared state
- Use Java ThreadLocal
Streaming
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 or if you'd like to suggest new ones, see the Issues section under the project website.
相关推荐
首先,我们来看Eclipse下的Gson使用示例。在Eclipse中,你需要先引入Gson库。这可以通过在项目构建路径中添加Gson的jar文件完成,或者如果你的项目是Maven项目,可以在pom.xml文件中添加对应的依赖: ```xml ...
要将这个用户对象转换为JSON字符串,可以使用Gson的`toJson()`方法: ```java Gson gson = new Gson(); String jsonString = gson.toJson(user); ``` `jsonString`现在包含了User对象的JSON表示。 2. JSON字符串转...
下面我们将详细探讨Gson的使用方法,并结合给出的`MyGsonTest`文件,分析其核心概念和操作步骤。 首先,我们需要引入Gson库。如果你的项目是Maven或Gradle项目,可以在构建文件中添加依赖。对于Maven,这将在`pom....
这个“我的gson学习例子”显然是一份关于如何使用Gson进行JSON操作的学习资料。下面我们将详细探讨Gson库的使用方法和相关知识点。 首先,我们要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...
`GsonDemo`通常是一个包含Gson使用示例的Java源文件,可能包含了各种序列化和反序列化的例子,如自定义类型适应器、处理日期类型、忽略字段等高级功能。通过这个示例文件,我们可以更深入地了解和学习Gson库的用法。...
压缩包中的"Gjson示例1.txt"、"Gjson示例2.txt"和"Gjson示例3.txt"很可能是包含Gson使用示例的代码文件。这些示例可能涵盖了如何将基本类型、复杂对象、集合、自定义类型转换为JSON,以及如何从JSON数据中解析这些...
JSON(JavaScript Object Notation)和Gson是Android开发中常用的数据序列化和反序列化工具,...以上就是关于“Android之json和gson数据解析最完整的代码例子”的详细介绍,希望对您在学习和使用JSON及Gson时有所帮助。
在“GsonDemo”中,可能包含了示例代码,展示如何在Android的Activity或Fragment中使用Gson进行网络请求后的数据解析,以及如何在保存和读取本地数据时利用Gson。此外,可能还涉及到异常处理,如`...
通过这些示例,开发者能够快速上手并灵活运用Gson进行JSON操作。在实际开发中,结合Android的网络请求库(如Retrofit或OkHttp),Gson可以更高效地处理网络返回的数据。同时,对于本地数据存储,如使用...
下面是几个小例子 1. toJson() example Java 代码 收藏代码 1. class TestObjectToJson { 2. private int data1 = 100; 3. private String data2 = "hello"; 4. } 5. 6. TestObjectToJson obj = new ...
在"Android下用Gson示例"项目中的`GSONAndroidSample-master`可能包含了更具体的示例代码和使用场景,如保存和加载对象到SharedPreferences,或者在网络请求中使用Gson处理JSON数据。通过深入研究这些示例,开发者...
2. 使用Gson实例解析JSON:有了JSON字符串和对应的数据模型类,我们可以使用Gson的fromJson()方法将JSON转换为Java对象。 ```java String jsonString = "{\"name\":\"John Doe\",\"age\":30,\"city\":\"New York\"}...
android google gson json解析
以下是一个简单的GSON使用示例,展示了如何将一个`User`对象序列化为JSON,然后反序列化回来。 ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class GSONDemo { public ...
在这个例子中,我们使用了 `TypeToken` 类来指定目标类型为 `List<Person>`。`TypeToken` 是 Gson 提供的一个泛型安全的类型引用,用于在运行时捕获和表示类型信息。 除了默认行为外,Gson 还支持通过注解...
通过这个示例,开发者可以学习如何在实际项目中有效地使用Gson来处理JSON数据,这对于任何涉及网络通信或需要存储结构化数据的应用来说都是至关重要的。无论是在Android开发还是普通的Java应用中,Gson都扮演着不可...
这个"Android Gson解析案例"可能包含了如何在Android应用中使用Gson进行基本和高级的JSON操作的示例代码,帮助开发者更好地理解和掌握这一强大的工具。通过学习和实践这些案例,开发者能够提升自己的Android应用开发...
本教程将详细阐述如何在Eclipse环境中使用Gson来解析JSON数据。 首先,我们需要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于语言的文本格式,...
下面是如何使用Gson进行解析的示例: ```java String jsonString = ...; // JSON字符串 Gson gson = new Gson(); // 将JSON字符串转换为Java对象 Type collectionType = new TypeToken<List<User>>(){}.getType();...
在本例中,我们将深入探讨如何使用Gson库进行JSON解析。 首先,我们需要在项目中引入Gson库。如果你的项目是Maven或Gradle项目,可以在pom.xml或build.gradle文件中添加对应的依赖。对于Maven项目,添加如下依赖: ...