Gson 概述与下载
1、Java
解析
Json
最常用的类库有:google 的
Gson
、
阿里巴巴的
FastJson、以及 Jackson。这些都是非常优秀而且常用的库。
2、GSON
是
Google
提供的
用来在
Java
对象和
JSON
数据之间进行映射的
Java
类库
,可以快速的将一个
Json
字符转成一个
Java
对象,或者将一个
Java 对象
转化为
Json
字符串。
3、gson 在 github 上开源地址:
https://github.com/google/gson
4、
注意事项:Gson 将 Map 序列化为 Json 字符串时,默认原本的整型会加上 .0 而变成浮点型,比如 0 -> 0.0,1 -> 1.0 。
二进制开发包下载
:gson 二进制开发包下载地址:
Maven Central Repository Search
gson-2.8.4.jar下载
、
gson-2.8.5.jar下载
Maven 依赖
:gson 在 Maven 仓库地址:
https://mvnrepository.com/artifact/com.google.code.gson/gson
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
Gson (反)序列化 Java 对象
1、
com.google.gson.Gson 提供 toJson() 和 fromJson() 方法用于序列化与反序列化 Java 对象。
2、Gson 对象的 toJson 方法可以将 Java 基本数据类型、数组、以及 POJO 对象、List、Map 、JsonElement 等转为 json 格式的字符串,
3、Gson 对象的 fromJson 方法做与 toJson 相反的操作,将 json 格式的字符串转为基本数据类型、 POJO 对象、List、Map 、JsonElement 等
|
对象序列化
|
|
T fromJson(String json, Class<T> classOfT)
|
将指定的 Json 反序列化为指定类的对象,如果指定的类是泛型类型,则使用 fromJson(String, Type)方法。
|
|
T fromJson(String json, Type typeOfT)
|
将指定的 Json 反序列化为指定类型的对象,如果指定的对象是泛型类型,则此方法很有用,对于非泛型对象,请改用 fromJson(String json, Class<T> classOfT)
|
|
T fromJson(JsonElement json, Class<T> classOfT)
|
将指定的 json 元素反序列化为指定类型的对象,如果指定的类是泛型类型,则使用 fromJson(JsonElement, Type) 方法。
|
|
T fromJson(JsonElement json, Type typeOfT)
|
|
T fromJson(Reader json, Class<T> classOfT)
T fromJson(Reader json, Type typeOfT)
|
将从指定字符输入流读取的Json反序列化为指定类的对象,如果指定的类是泛型类型,则调用 {@link#fromJson(Reader,type)}
|
|
序列化为对象
|
|
String toJson(Object src)
|
将指定的对象序列化为其等效的Json表示形式,当指定的对象不是泛型类型时,应使用此方法,如果对象是泛型类型,请改用 toJson(object,type).
|
|
String toJson(Object src, Type typeOfSrc)
|
将指定的对象(包括泛型类型的对象)序列化为其等效的Json表示形式,对于非泛型对象,请改用{@link#toJson(Object)}
|
|
String toJson(JsonElement jsonElement)
|
将 JsonElement 转换为其等效的JSON表示形式。
|
|
JsonElement toJsonTree(Object src)
|
将指定的对象序列化为 JsonElement 的等效表示形式,当指定的对象不是泛型类型时,应使用此方法;如果对象是泛型类型,请改用{@link#toJsonTree(object,type)}
|
|
JsonElement toJsonTree(Object src, Type typeOfSrc)
|
|
API 演示源码:
src/main/java/com/wmx/gson/GsonTest.java · 汪少棠/apache-study - Gitee.com
JsonElement Json 元素
1、JsonObject、JsonArray、JsonPrimitive、JsonNull 都是 JsonElement 的子类,JsonElement 常用方法:
|
JsonElement deepCopy()
|
返回此元素的深层副本,克隆。
|
|
BigDecimal getAsBigDecimal()
|
将此元素作为 BigDecimal 类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException,
如果元素不是有效的 BigDecimate,则 @throws NumberFormatException。
如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
|
|
BigInteger getAsBigInteger()
|
将此元素作为 BigInteger 类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException,
如果元素不是有效的 BigInteger ,则 @throws NumberFormatException。
如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
|
|
boolean getAsBoolean()
|
将此元素作为原始布尔值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException,
如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException
|
|
byte getAsByte()
|
将此元素作为原始 byte 值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException,
如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException
|
|
其它 Java 基本数据类型也是同理:
double getAsDouble()、char getAsCharacter()、float getAsFloat()、int getAsInt()、long getAsLong()、short getAsShort()
|
|
JsonArray getAsJsonArray()
|
将此元素作为 JsonArray 获取,如果元素是其他类型的元素,则会生成 IlleglastateException 异常,
因此最好先调用 isJsonArray() 方法确保该元素是所需的类型,然后再使用此方法。
|
|
JsonObject getAsJsonObject()
|
将此元素作为 JsonObject 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
因此最好先通过调用 isJsonObject() 方法来确保该元素是所需类型之后使用此方法。
|
|
JsonPrimitive getAsJsonPrimitive()
|
将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。
JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。
|
|
boolean isJsonArray()
|
验证此元素是否为数组,如果此元素属于 JsonArray 类型,则返回 true,否则返回 false。
|
|
boolean isJsonNull()
|
验证此元素是否表示 null 值,如果此元素的类型为 JsonNull,则返回 true,否则返回 false。
|
|
boolean isJsonObject()
|
验证此元素是否为 JsonObject 对象。
|
|
boolean isJsonPrimitive()
|
以验证此元素是否为 Java 数据类型。
|
* JsonPrimitive getAsJsonPrimitive():
* 将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,
* 因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。
@Test
public void test12() {
String json = "[\"本级小计\",368.00,328.00,]";
JsonElement sourceJsonElement = new JsonParser().parse(json);
JsonArray jsonArray = sourceJsonElement.getAsJsonArray();
for (int i = 0; i < jsonArray.size(); i++) {
JsonElement jsonElement = jsonArray.get(i);
if (jsonElement.isJsonPrimitive()) {
JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();
if (jsonPrimitive.isString()) {
System.out.println(jsonPrimitive.getAsString());
} else if (jsonPrimitive.isNumber()) {
System.out.println(jsonPrimitive.getAsDouble());
API 演示源码:
src/main/java/com/wmx/gson/JsonObjectTest.java · 汪少棠/apache-study - Gitee.com
src/main/java/com/wmx/gson/JsonArrayTest.java · 汪少棠/apache-study - Gitee.com
JsonObject Json 对象
|
add(String property, JsonElement value)
|
添加一个健-值对的成员,名称必须是字符串,但值可以是任意的 JsonElement 类型。
|
|
addProperty(String property, Boolean value)
|
添加布尔成员的便利方法,指定的值将转换为布尔值的 JsonPrimitive。
|
|
addProperty(String property, Character value)
|
添加 char 成员的便利方法,指定的值将转换为字符的 JsonPrimitive。
|
|
addProperty(String property, Number value)
|
添加 Number 成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
|
|
addProperty(String property, String value)
|
添加 String 成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
|
|
Set<Map.Entry<String, JsonElement>> entrySet()
|
返回此对象的所有成员,集合是有序的,与元素的添加顺序相同。
|
|
JsonElement get(String memberName)
|
返回具有指定名称的成员。
|
|
JsonArray getAsJsonArray(String memberName)
|
获取指定成员作为 JsonArray 的便利方法。
|
|
JsonObject getAsJsonObject(String memberName)
|
获取指定成员作为 JsonObject 的便利方法。
|
|
JsonPrimitive getAsJsonPrimitive(String memberName)
|
获取指定成员作为 JsonPrimitive 的便利方法。
|
|
boolean has(String memberName)
|
检查此对象中是否存在具有指定名称的成员的便利方法。
|
|
Set<String> keySet()
|
返回所有成员的 key 值。
|
|
JsonElement remove(String property)
|
从此 JsonObject 中删除指定的属性,返回被删除的属性。
|
|
int size()
|
返回对象中键/值对的数目。
|
* int size():返回对象中键/值对的数目。
* Set<String> keySet():返回所有成员的键值
@Test
public void jsonObject7() {
String json = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
System.out.println(jsonObject.size());
Set<String> keySet = jsonObject.keySet();//3
System.out.println(keySet);//[pId, pName, isMarry]
API 演示源码:
src/main/java/com/wmx/gson/JsonObjectTest.java · 汪少棠/apache-study - Gitee.com
JsonArray Json 数组
|
JsonArray()
JsonArray(int capacity)
|
两个构造器,一个是创建空的 Json 数组,一个是指定初始容量。
|
|
add( Boolean value)
|
将指定的布尔值添加到 json 数组,如 value 为 null,则添加 JsonNull。
|
|
add(Character value)
|
将指定的 Character 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
|
|
add(Number value)
|
将指定的 Number 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
|
|
add(String value)
|
将指定的 String 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
|
|
add(JsonElement value)
|
将指定的 JsonElement 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
|
|
addAll(JsonArray array)
|
将指定数组中的所有元素添加到此 json 数组。
|
|
boolean contains(JsonElement element)
|
如果此数组包含指定的元素,则返回true。
|
|
JsonElement get(int i)
|
返回数组的第 i 个元素,如果下标越界,则抛异常
|
|
Iterator<JsonElement> iterator()
|
返回一个迭代器来导航数组的元,由于数组是一个有序列表,迭代器按照元素插入的顺序导航元素。
|
|
JsonElement remove(int index)
|
删除此数组中指定位置的元素,向左移动任何后续元素(从其索引中减去一个),返回从数组中删除的元素。
|
|
boolean remove(JsonElement element)
|
从该数组中删除第一个出现的指定元素(如果存在)。如果数组不包含元素,则它将保持不变。
|
|
JsonElement set(int index, JsonElement element)
|
将此数组中指定位置的元素替换为指定元素,元素不能为null。
|
|
int size()
|
返回数组的大小。
|
@Test
public void test4() {
JsonArray jsonArray = new JsonParser().parse("[{\"code\":200,\"msg\":\"成功\"}]").getAsJsonArray();
JsonArray deepCopy = jsonArray.deepCopy();
deepCopy.add("Yes");
System.out.println(jsonArray);//[{"code":200,"msg":"成功"}]
System.out.println(deepCopy);//[{"code":200,"msg":"成功"},"Yes"]
API 演示源码:src/main/java/com/wmx/gson/JsonArrayTest.java · 汪少棠/apache-study - Gitee.com
JsonParser Json 解析
1、JsonParser 用于将 Json 字符内容解析为 json 元素 JsonElement。
| JsonElement parse(Reader json) | 将指定的 JSON 字符串字符输入流解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。 |
| JsonElement parse(String json) | 将指定的 JSON 字符串解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。 |
@Test
public void test1() {
String json = "{\"id\":1000,\"name\":\"华安\",\"birthday\":\"Jul 13, 2020 8:46:42 PM\",\"marry\":true}";
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
JsonObject jsonObject = jsonElement.getAsJsonObject();
System.out.println(jsonObject);//{"id":1000,"name":"华安","birthday":"Jul 13, 2020 8:46:42 PM","marry":true}
API 演示源码:src/main/java/com/wmx/gson/JsonParserTest.java · 汪少棠/apache-study - Gitee.com
GsonBuilder 构建 Gson
1、对于默认配置的 Gson,直接使用 new Gson 更简单,当需要设置默认值以外的配置选项时,使用 GsonBuilder 构建器,调用它的各种配置方法,最后调用 create 方法创建 Gson 对象。
| GsonBuilder serializeNulls() | 序列化空字段,默认情况下,Gson 序列化期间会忽略所有为 null 的字段 |
| GsonBuilder setDateFormat(String pattern) | 根据提供的模式序列化 Date 日期对象,可以多次调用,但只有最后一次调用将用于决定序列化格式。 |
| GsonBuilder setFieldNamingPolicy(FieldNamingPolicy namingConvention) 1、配置为在序列化和反序列化期间将特定命名策略应用于对象的字段。 2、namingConvention:用于序列化和反序列化的 JSON 字段命名约定/策略,可选值如下: IDENTITY:使用对象默认的字段名称 UPPER_CAMEL_CASE:使用驼峰命名 UPPER_CAMEL_CASE_WITH_SPACES:将 Java 字段名的第一个'字母'在序列化为JSON格式时大写,单词之间用空格隔开 LOWER_CASE_WITH_UNDERSCORES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间由下划线分隔 LOWER_CASE_WITH_DASHES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间用破折号(-)分隔 LOWER_CASE_WITH_DOTS:使用此命名策略将 Java 字段名从大小写形式修改为全小写字段名,其中每个单词用点(.)分隔。 |
@Test
public void test1() {
Gson gson = new GsonBuilder()
.serializeNulls()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
.create();
Person person = new Person();
person.setId(100);
person.setBirthday(new Date());
String toJson = gson.toJson(person);
//{"id":100,"name":null,"birthday":"2020-07-19 11:37:35","marry":null}
System.out.println(toJson);
Person person1 = gson.fromJson(toJson, Person.class);
//Person{id=100, name='null', birthday=Sun Jul 19 11:37:35 CST 2020, marry=null}
System.out.println(person1);
API 演示源码:src/main/java/com/wmx/gson/GsonBuilderTest.java · 汪少棠/apache-study - Gitee.com
1. 通过json字符串给 初始化对象:
class Util_JsonToObject{
public static T jsonToObject(String jsonstring, Class type){ // 含泛型的方法 并不是返回值;
Gson son = new Gson();
T student = son.fromJson(jsonstring,type
Gson Goals
Provide simple toJson() and fromJson() methods to convert Java objects to JSON and vice-versa
Allow pre-existing unmodifiable objects to be converted to and from JSON
Extensive support of Java Generics
Allow custom representations for objects
Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)
Gson Downloads
作者 |沉默王二责编 | 张文头图 | CSDN 下载自视觉中国来源 | 沉默王二(ID:cmower)关于我我叫 GSON,是一款开源的 Java 库。主要用途为序列化 Java...
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。
原因分析:
仅仅在Build.Gradle文件中添加远程依赖implementation 'com.google.code.gson:gson:2.8.2',Gradle并不会直接把远程包下载到本地,所以在源码中增加import com.googl.
1、Gson的安装引用1)通过Gradle引用dependencies {implementation 'com.google.code.gson:gson:2.8.5'}2)通过Maven引用com.google.code.gsongson2.8.52、Gson使用示例代码1)基本数据类型示例// 序列化Gson gson = new Gson();gson.toJson(1); ...
赠送jar包:gson-2.6.2.jar;
赠送原API文档:gson-2.6.2-javadoc.jar;
赠送源代码:gson-2.6.2-sources.jar;
包含翻译后的API文档:gson-2.6.2-javadoc-API文档-中文(简体)-英语-对照版.zip
对应Maven信息:groupId:com.google.code.gson,artifactId:gson,version:2.6.2
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
双语对照,边学技术、边学英语。
赠送jar包:gson-2.8.6.jar;
赠送原API文档:gson-2.8.6-javadoc.jar;
赠送源代码:gson-2.8.6-sources.jar;
赠送Maven依赖信息文件:gson-2.8.6.pom;
包含翻译后的API文档:gson-2.8.6-javadoc-API文档-中文(简体)-英语-对照版.zip;
Maven坐标:com.google.code.gson:gson:2.8.6;
标签:google、gson、中英对照文档、jar包、java;
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
双语对照,边学技术、边学英语。
赠送jar包:gson-2.8.9.jar;
赠送原API文档:gson-2.8.9-javadoc.jar;
赠送源代码:gson-2.8.9-sources.jar;
赠送Maven依赖信息文件:gson-2.8.9.pom;
包含翻译后的API文档:gson-2.8.9-javadoc-API文档-中文(简体)版.zip;
Maven坐标:com.google.code.gson:gson:2.8.9;
标签:google、gson、jar包、java、中文文档;
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。