快速了解Gson

2019-03-21 23:49|来源: 网路

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。GSON核心jar包不到1M,非常精简,但提供的功能无疑是非常强大的,如果使用JDK自带的JSON解析API,使用起来相对比较繁琐一点,而且代码量较多。

  Gson使用简单,可以实现含有多层引用、继承的java对象与json间转化,还可以通过annotation进行选择性的属性转化  


Google Gson是一个开源的,基于Java的类库。它是由Google开发的,使用Gson有助于将Java对象序列化为JSON,反之亦然。 本教程采用简单直观的方式来描述Google Gson的基本到高级概念以及如何使用其API。

以下几点说明为什么应该使用这个库 -

  • 标准化 - Gson是一个由Google管理的标准化库。

  • 高效 - 这是对Java标准库的可靠,快速和高效的扩展。

  • 优化 - Gson库经过高度优化。

  • 支持泛型 - 它为泛型提供了广泛的支持。

  • 支持复杂的内部类 - 它支持具有深度继承层次结构的复杂对象。

Gson的特点

这里列出了Gson的一些最显着的特点 -

  • 易于使用 - Gson API提供了一个高级外观来简化常用的用例。

  • 无需创建映射 - Gson API为大部分要序列化的对象提供了默认映射。

  • 性能优 - Gson速度相当快,内存占用量低。 它适用于大型对象图或系统。

  • 干净JSON - Gson创建一个干净而紧凑的JSON结果,它易于阅读。

  • 无依赖性—Gson库不需要JDK以外的任何其他库。

  • 开源 - Gson库是开源的; 它是免费提供的。


处理JSON的三种方法

Gson提供了三种处理JSON的替代方法 -

1. 流媒体API

它读取和写入JSON内容作为离散事件。 JsonReaderJsonWriter将数据读取/写入令牌,称为JsonToken

这是处理JSON的三种方法中最强大的方法。 它具有最低的开销,并且在读/写操作中速度非常快。 它类似于用于XML的Stax解析器。

2. 树模型
它准备JSON文档的内存树表示。 它构建了一个JsonObject节点树。 这是一种灵活的方法,类似于XML的DOM解析器。

3. 数据绑定
它使用属性访问器将JSON转换为POJO(普通旧Java对象)并从中转换。 Gson使用数据类型适配器读取/写入JSON。 它类似于XML的JAXB解析器。


Gson特征:

1、提供简单的toJson()和fromJson()方法的java对象转换为JSON,反之亦然      

2、允许预先存在不可改变的对象被转换为和从JSON      

3、广泛支持的java泛型      

4、允许自定义对象的意见      

5、支持任意复杂的对象(深层次结果和继承泛型类型的广泛使用)      


项目地址:

https://github.com/google/gson      


最新版本:

<dependency>      

<groupId>com.google.code.gson</groupId>      

<artifactId>gson</artifactId>      

<version>2.7</version>      

</dependency>      


常用API:

Gson gson = new Gson();//全部属性转换实例化
gson.toJson(user);//对象转化为json
gson.fromJson(json, User.class);//json转化为对象
gson.toJson(list);//list转化为json
gson.fromJson(json, new TypeToken<List<User>>(){}.getType());//json转化为list


简单示例:

Gson gson = new Gson();

Map map = new HashMap();

map.put("a", "b");

map.put("c", 5);

System.out.println(gson.toJson(map));


相关问答

更多
  • Millennial实际上是通过重命名内部GSON库来修复SDK 5.0.1版本(将于下周发布,等待一些额外的质量保证)。 Millennial SDK未经修改使用GSON 2.2.2版。 你可以在MMSDK.jar中使用GSON,或者,如果绝对必要的话,可以使用Millennial的JAR,并删除“com / google / gson /”目录并重新启动它。 像往常一样,您也可以直接与Millennial联系: https : //tools.mmedia.com/user/supportDevPort ...
  • 使用TypeToken ,根据GSON常见问题解答 : Gson gson = new Gson(); Type stringStringMap = new TypeToken>(){}.getType(); Map map = gson.fromJson(json, stringStringMap); 没有铸造。 没有不必要的对象创建 Use TypeToken, as per the GSON FAQ: Gson gson = ne ...
  • 更改模型名称MoviesData表单Films , val moviesData= gson.fromJson(moviesJsonString, MoviesData::class.java)//Here you get moviesData array . Change Model Name MoviesData Form Films, val moviesData= gson.fromJson(moviesJsonString, MoviesData::class.java)//Here you ...
  • Gson无法处理序列化数据中的循环引用。 你有机会。 解决这个问题,你已经解决了问题。 I created an issue for this on the google code site. http://code.google.com/p/google-gson/issues/detail?id=488
  • 您可能需要混合解决方案才能完成此项工作。 原因是@SerializedName是一个GSON注释,并不是Realm知道的。 所以这意味着你有两个选择,你已经发现: 1)使用GSON,这意味着最终结果是一个null name为默认值的对象。 2)使用createOrUpdateObjectFromJson这意味着_id将被忽略,因为Realm的JSON解析器需要1:1映射。 由于这两种解决方案都不能正常工作,您可以按照以下方式修改它们 1)使用GSON,而不是执行copyToRealmOrUpdate您可以手 ...
  • 来自Gson用户指南 : 如果字段标记为瞬态(默认情况下),则忽略该字段,并且不包括在JSON序列化或反序列化中。 ... 默认情况下,如果将字段标记为瞬态,则会将其排除。 同样,如果某个字段标记为“静态”,则默认情况下会将其排除。 因此,解决问题的方法只是将logger标记为瞬态或静态,例如: transient Logger logger = Logger.getRootLogger(); 这样,变量将从序列化和反序列化中排除,并且您不会得到该错误。 From the Gson User Guide: ...
  • 替换这个: gson.toJson(p); String json = gson.toString(); 有了这个: String json = gson.toJson(p); Replace this: gson.toJson(p); String json = gson.toString(); with this: String json = gson.toJson(p);
  • 我相信你把javac和java参数顺序混淆了。 语法是: javac 和 java [-options] class [args...] 所以它应该是这样的 javac -cp gson.jar myProgram.java java命令也是如此。 I believe you have the javac and java argument order mixed up. The syntax is: javac
  • 成功回调函数似乎无法解析JSON结果。 尝试将值作为URL查询字符串传递给servlet,例如http://localhost/project/Analysis?team=some-value-you-know 然后使用像http://jsonlint.com这样的工具验证打印的JSON,修复你正在生成的JSON [可能是围绕JSON对象键的双引号]。 还可以尝试在浏览器中使用Developer Tools的JavaScript控制台,它将帮助您解决JavaScript错误。 希望这可以帮助, Shareb ...
  • JsonSerializer是序列化Object的字段,而不是对象本身。 但是,您传递的对象已经告诉Gson要序列化。 下列 @Override public JsonElement serialize(ControlTransaction ctr, Type type, JsonSerializationContext context) { return context.serialize(ctr, type); } 相当于 @Override public JsonElemen ...