文章目录

  • 1. 创建GSON的两种方法
  • getAsString()方法返回JsonNull异常问题解决
  • 自定义的返回:setExclusionStrategies
  • 公司项目中使用的实例:

用法详解参考文章,点击这里

1. 创建GSON的两种方法

使用Gson的第一步是创建一个Gson对象,创建爱你Gson对象有两种方式:

  • 使用 new Gson()
  • 创建GsonBuilder实例,使用 create() 方法
    使用new Gson(),此时会创建一个带有默认配置选项的Gson实例,如果不想使用默认配置,那么就可以使用GsonBuilder。
//serializeNulls()是GsonBuilder提供的一种配置,当字段值为空或null时,依然对该字段进行转换
Gson gson = new GsonBuilder().serializeNulls().create();

使用GsonBuilder创建Gson实例的步骤:
首先创建GsonBuilder,然后调用GsonBuilder提供的各种配置方法进行配置,
最后调用GsonBuilder的create方法,将基于当前的配置创建一个Gson实例。
GsonBuilder的一些配置
参考文章,点击这里
详情配置,点击这里

 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() //不对没有用@Expose注解的属性进行操作.enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法.serializeNulls() //当字段值为空或null时,依然对该字段进行转换.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //时间转化为特定格式.setPrettyPrinting() //对结果进行格式化,增加换行.disableHtmlEscaping() //防止特殊字符出现乱码.registerTypeAdapter(User.class,new UserAdapter()) //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口.create();

getAsString()方法返回JsonNull异常问题解决

概述
在使用google.gson工具时,JsonElement的getAsString()方法返回JsonNull异常问题。

问题描述
使用google.gson工具时经常会使用的就是反序列化功能。比如看下面的一个方法:

private static JsonParser parser= new JsonParser();public String parseJsonString(String raw) {JsonElement jsonElement = JSON_PARSER.parse(raw);JsonObject jsonObject = jsonElement.getAsJsonObject();JsonElement dataType = jsonObject.has("dataType")? jsonObject.get("dataType"): null;if(dataType != null) {return jsonObject.get("dataType").getAsString();}return "null";
}

上述代码执行到if语句处会判定dataType != null,实际上这个判断根本就无法过滤json为null的情况,比如有如下的json数据:

{"dataType": null
}

下述代码返回的结果为:

JsonElement dataType = jsonObject.has("dataType")? jsonObject.get("dataType"): null;
//因为json数据中有"dataType"键,所以jsonObject.has("dataType")会返回true,那么dataType的值就是jsonObject.get("dataType")的值,也就是上述json数据中的所谓的null

dataType实际上并不是所谓的java中的null,而是一种json所表征的null,它既不是字符串,同时dataType!=null会判为true,因为dataType中是存有数据的,它存的是一种表征json值为null的数据,因为dataType!=null会判为true,然后会进入if条件语句块执行getAsString(),那么此时会报JsonNull的异常。所以上述的判断语句不能只用dataType != null来做判断条件,还需要加一条专门用来判断json为null的语句,即:isJsonNull()方法,这是JsonElement类的非静态方法。所以下述条件判断才是正确的:

if(dataType != null && !dataType.isJsonNull()) {return jsonObject.get("dataType").getAsString();
}
//这一次则无法进入if语句块内部,因为:
dataType.isJsonNull()返回true,则
!dataType.isJsonNull()返回false

自定义的返回:setExclusionStrategies

 class Item {String name;@Exposepublic int age;public void gson() {// 过滤掉声明为 protcted 的变量Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {@Overridepublic boolean shouldSkipField(FieldAttributes f) {//过滤掉字段名包含"age"return f.getName().contains("age");}@Overridepublic boolean shouldSkipClass(Class<?> clazz) {//过滤掉 类名包含 Bean的类return clazz.getName().contains("Bean");}}).create();}}

公司项目中使用的实例:

如果你 Java 对象中包含一个正常的 Floats 或者 Doubles 类型的数据,是可以正常序列化得到 JSON的,如果你传入 Float.POSITIVE_INFINITY 值,Gson 将会抛出异常,因为这个值是不能符合 JSON 标准的
解决的办法就是通过 GsonBuilder 设置 serializeSpecialFloatingPointValues() 方法
参考文章,点击这里

 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() //不对没有用@Expose注解的属性进行操作.enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法.serializeNulls() //当字段值为空或null时,依然对该字段进行转换.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //时间转化为特定格式.setPrettyPrinting() //对结果进行格式化,增加换行.disableHtmlEscaping() //防止特殊字符出现乱码.registerTypeAdapter(User.class,new UserAdapter()) //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口.create();
/** Copyright (c) 2020. XiaoMi Inc. All Rights Reserved.* Authors: Sun Zhenkai <sunzhenkai@xiaomi.com>.* Created on 2020/3/13 14:54:39.*/import org.apache.thrift.TSerializer;
import org.apache.thrift.protocol.TSimpleJSONProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.reflect.Type;public class GsonUtils {private static final Logger logger = LoggerFactory.getLogger(GsonUtils.class);static GsonBuilder gsonBuilder = new GsonBuilder();private static final Gson gson = new Gson();public static final Gson gsoner = gsonBuilder.registerTypeAdapter(Double.class, new DoubleAdapter()).registerTypeAdapter(Float.class, new FloatAdapter()).setExclusionStrategies(new ExclusionStrategy() {@Overridepublic boolean shouldSkipField(FieldAttributes fieldAttributes) {return fieldAttributes.getName().equals("__isset_bit_vector");}@Overridepublic boolean shouldSkipClass(Class<?> aClass) {return false;}}).create();private static class DoubleAdapter implements JsonSerializer<Double> {@Overridepublic JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {if (src == null || Double.isNaN(src) || Double.isInfinite(src)) {logger.warn("illegal double value [{}], use 0 instead", src);return gson.toJsonTree(0);} else {return gson.toJsonTree(src);}}}private static class FloatAdapter implements JsonSerializer<Float> {@Overridepublic JsonElement serialize(Float src, Type typeOfSrc, JsonSerializationContext context) {if (src == null || Float.isNaN(src) || Float.isInfinite(src)) {logger.warn("illegal float value [{}], use 0 instead", src);return gson.toJsonTree(0);} else {return gson.toJsonTree(src);}}}}

使用google.gson工具时-JSON(谷歌)的使用相关推荐

  1. Google自动翻译工具:对接谷歌翻译接口,实现本地化运行

    Google自动翻译工具通过对接谷歌翻译api接口,实现Google翻译本地化运行,通过Google自动翻译工具我们可以对我们的txt/word/excl等多格式文本进行批量的翻译,并且会保留翻译格式 ...

  2. Gson:GitHub 标星 18K 的 JSON 解析器,Google 出品的 Java JSON 解析器,强烈推荐!

    01.前世今生 我叫 Gson,是一款开源的 Java 库,主要用途为序列化 Java 对象为 JSON 字符串,或反序列化 JSON 字符串成 Java 对象.从我的名字上,就可以看得出一些端倪,我 ...

  3. Google Gson的使用方法及JSON 技术对比

    为什么80%的码农都做不了架构师?>>>    一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib ...

  4. google的gson工具使用

    google提供了一个Gson的工具,能够将.json文件转换成对象,具体使用如下: 首先需要将json对象序列号成对象,需要实现JsonDeserializer接口 import com.googl ...

  5. java gson 工具类_gson工具类将Java类转换为json的使用

    示例如何将一个 Student 对象转换成 json 串,实际操作中我们也可以将任意的 Java 类转换为 json 串,并且实施起来也非常简单,你仅仅需要创建一个 Gson 实例,然后传递将被转化为 ...

  6. Okhttp源码分析以及Google Gson解析json数据实例

    Okhttp Github的Okhttp OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接 透明的GZIP压缩减少响 ...

  7. Gson().fromJson将json字符串转成对象时,执行非常慢,原因可能是版本的问题

    Gson().fromJson将json字符串转成对象时,执行非常慢,原因可能是版本的问题 1.将1.3的版本升级成1.7的,转换速度就非常快了 附: json数据大小

  8. Google GSON入门

    在Java世界中,JSON已成为事实上的XML数据交换格式标准,因为它的易用性和传输效率高. 如果您不了解JSON,那就是Javascript对象表示法,这是一种基于文本的数据交换格式,是名称-值的集 ...

  9. java——json工具类(json字符串转实体bean)

    本文使用谷歌的Gson来解析,导入包: implementation 'com.google.code.gson:gson:2.2.+' 首先在Android studio上安装插件 GsonForm ...

最新文章

  1. Delphi常用时间函数列表
  2. 合工大建筑和计算机专业哪个好,合肥工业大学最好的专业是什么(10大热门专业排名)...
  3. 008_Redis的ZSet数据类型
  4. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法
  5. shell排序-c语言
  6. .[转] 几米语录 生活永远不是童话
  7. mysql myisam 主从_MySQL的主从复制Replication之MyIsam和InnoDB数据复制发布
  8. flask + celery实现定时任务和异步
  9. 好程序员web前端分享CSS3边框
  10. postgresql 查询序列_RazorSQL for Mac(数据库工具查询) v9.0.9
  11. 十分钟上线 - 函数计算构建支付宝小程序的后端
  12. 使用Maven开发用户模块的CRUD(增删改查)
  13. createsolidcaret 后 很快就不闪烁了_【文献推送】Adv. Mater. | 单分散硅基闪烁体实现X射线介导的深层肿瘤光动力治疗...
  14. 基于词典和弱标注信息的电影评论情感分析系统
  15. Centos7 安装solr及配置
  16. Android开发之常见事件响应方式
  17. 逻辑门、锁存器和触发器
  18. HW-RTOS 概述
  19. 看传智播客刘龙宾老师的Vue.js学习笔记
  20. android地图画线,绘制折线-在地图上绘制-开发指南-Android 轻量版地图SDK | 高德地图API...

热门文章

  1. python 读取邮件
  2. java2d游戏代码_Java 2d游戏中的“JUMP”
  3. Android开源库总结
  4. 022 利用头皮脑电信号预测癫痫发作2021
  5. VSCode:当匹配到结果时,如何一次性全部选中操作(复制 删除)?
  6. 机器人学的数理基础知识
  7. oracle多边形经纬范围筛选_Oracle根据经纬度查询一定范围内的数据
  8. Workflow:Workflow 百科
  9. 我的京东管理生涯随想 1
  10. M5A78L-M LX3 PLUS 触发不显