转自:http://www.blogjava.net/hello-yun/archive/2012/04/16/374755.html
扫盲:
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率.
从结构上看,所有的数据(data)最终都可以分解成三种类型:
第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(",")分隔。
2) 映射用冒号(":")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。
-----------------------------------------------------------------
最快速入门贴:
1. 对象的序列化和反序列化
Type listType = new TypeToken<List<String>>() {}.getType();
List<String> target = new LinkedList<String>();
target.add("blah");
Gson gson = new Gson();
String json = gson.toJson(target, listType);
List<String> target2 = gson.fromJson(json, listType);
OK,最简方案打完收工.
2.使用GsonBuilder.
GsonBuilder用来生成Gson对象. 规定Gson的序列化和返序列化时的格式等内容.
如:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Id.class, new IdTypeAdapter())
.enableComplexMapKeySerialization()
.serializeNulls()
.setDateFormat(DateFormat.LONG)
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写
.setPrettyPrinting()
.setVersion(1.0)
.create();
3. 使用注解,定制序列化字段.
默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法
来个例子:
public class User {
@Expose private String firstName;
@Expose(serialize = false) private String lastName;
@Expose (serialize = false, deserialize = false)
private String emailAddress; private String password;
}
如果你创建Gson对象的时候使用的是new Gson(),toJson()和fromJson()方法将会对全部的字段生效.但是如果你使用的是GsonBuilder并且调用了excludeFieldsWithoutExposeAnnotation()方法.那么:toJson()和fromJson()将不会包括password.因为password没有包含@Expose注解.
序列化的时候将不包括 lastName和emailAddress,因为注解中标明不进行序列化.同样的道理,反序列化时将不包括emailAddress.
注:如果仅仅是想把某些特定的字段包含在外和话,可以使用transient 关键字声明字段.
4. 使用注解对序列化名称进行声明
这个简单,上例子都能懂,不解释:
public class SomeClassWithFields {
@SerializedName("name")
private final String someField;
private final String someOtherField;
public SomeClassWithFields(String a, String b) {
this.someField = a;
this.someOtherField = b;
}
}
===== OUTPUT =====
{"name":"a","someOtherField":"b"}
5. 例用注解,根据版本进行序列化
有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
@Since(版本号)能完美地实现这个功能.
当然,GsonBuilder.setVersion(double)方法需要调用.
例程如下:
public class User {
private String firstName;
private String lastName;
@Since(1.0) private String emailAddress;
@Since(1.0) private String password;
@Since(1.1) private Address address;
}
还的字段可能,随着版本的升级而删除,那么
@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
public class User {
private String firstName;
private String lastName;
@Until(1.1) private String emailAddress;
@Until(1.1) private String password;
}
maven pom.xml 设置
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.1</version>
</dependency>
分享到:
相关推荐
然而,在使用Gson库进行JSON序列化和反序列化时,枚举处理默认方式可能无法满足所有需求。本篇文章将详细探讨如何通过自定义Gson适配器实现枚举类型的统一序列化和反序列化处理,无需预先定义枚举,也无需修改Gson...
在Java开发中,Gson库是一个非常常用的JSON解析和序列化工具,由Google提供。它允许我们将Java对象转换为对应的JSON字符串,同时也能将JSON数据转换回Java对象。本篇文章将深入探讨如何在使用Gson时进行自定义的序列...
Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码),对应文章链接:https://blog.csdn.net/ZiFung_Yip/article/details/89143255
在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...
在Java开发中,序列化和反序列化是数据转换的重要环节,主要用于将对象转换为可存储或传输的数据格式,如JSON字符串,以及将这些数据还原为原来的对象。本压缩包包含fastJson、Gson和Jackson这三种流行JSON库的jar...
本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...
2. **自定义序列化与反序列化**:Gson允许我们通过实现`JsonSerializer`和`JsonDeserializer`接口来自定义对象的转换逻辑。 3. **流式API**:Gson 2.3.1引入了流式API,允许在不创建完整JSON树的情况下处理JSON数据...
Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...
JSON(Java Script Object Notation)是一种轻量级的数据交换格式,通常用于在不同系统之间传输数据。JSON 数据以键值对的形式写法,易于阅读和编写。 1、跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同...
Gson反序列化默认值失效深入讲解 Gson反序列化是一种常用的数据序列化和反序列化技术,它广泛应用于 Android 开发、Web 开发等领域。然而,在使用 Gson 进行反序列化时,可能会出现默认值失效的问题,本文将深入...
1. **序列化与反序列化**:Gson库的主要任务是将Java对象转换成JSON字符串(序列化),以及将JSON字符串解析为对应的Java对象(反序列化)。例如,你可以通过`Gson().toJson()`方法将一个Java对象转换成JSON,同时...
gson序列化,反序列化工具包,用来做工具报表使用,
本文将深入探讨如何利用Gson库进行多枚举类型的统一序列化和反序列化处理,以此避免为每个枚举类型单独创建Adapter。 首先,我们需要了解Gson的基本用法。Gson的核心类是`Gson`,它提供了`toJson()`和`fromJson()`...
Java中,除了基本的序列化机制,还有许多第三方库如Jackson、Gson等,它们提供了更高效、更灵活的JSON序列化和反序列化功能。例如,Jackson库的`ObjectMapper`类能够方便地将Java对象转换为JSON字符串,反之亦然。 ...
在上述代码中,`MyCustomAdapter`是自定义的类型适配器,Gson会在序列化或反序列化`User`对象时调用这个适配器。 ### 处理复杂类型 Gson支持多种复杂类型的转换,如列表、映射等。例如,将一个`List<User>`转换为...
格森·菲尔FHIR的Gson序列化类概述该库包含所有491个FHIR资源和STU3定义的引用类型,并建模为带有适当Gson序列化注释的旧Java类(POJO)。 这是使用基于JSON的FHIR事务序列化的Java应用程序的便捷库。伪像Maven:...
`protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...
Gson允许我们对特定类型的序列化和反序列化进行自定义。可以通过实现`JsonSerializer`和`JsonDeserializer`接口来实现这一目标。 6. **高级用法** - **忽略未知字段**:如果JSON字符串包含对象中不存在的字段,...
在这个"Android下用Gson示例"中,我们将探讨如何在Android应用中有效地利用Gson库进行序列化和反序列化操作。 **Gson库介绍** Gson库是一个轻量级的库,它提供了简单的方法将Java对象转换为它们的JSON表示形式,...