最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度的值是double的默认值,那么返回0,而不是返回0.0,而我处理json一般使用的Gson来处理,如果简单的直接使用 new Gson().toJson(obj) 这种形式,那么是达不到我们想要的结果,因此我们需要自定义 Gson 的序列化来实现我们想要的结果,而 Gson 的TypeAdapter正好可以实现我们的功能。

TypeAdapter是 Gson 提供的用于某种类型的 序列化和反序列操作,并且它是强类型操作。比如TypeAdapter<Double>就只可以序列化和反序列操作Double这种类型,而不会对别的类型生效。TypeAdapter的使用需要注册到 Gson 的实例上。new GsonBuilder().registerTypeAdapter(类型,TypeAdapter实例).create();

需求:
    1、向前台返回一个地理位置的 json 数据,其中 经纬度是Double类型,如果Double的值是0时,页面上json的格式是 {key:0} 不可以是 {key:0.0}
    2、如果 Double 类型的数据值是 null,那么不向页面上返回。

实现:
    1、自定义一个 TypeAdapter 来处理 Double 类型的数据

一、定义一个地理位置 Location 对象
    @SerializedName 注解表示序列化后 json 的key 的是什么样的。

/**
* 地理位置
*
* @author huan.fu
* @date 2018/8/15 - 10:50
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Location {
/**
* 纬度
*/
@SerializedName("longitude")
private Double lat;
/**
* 经度
*/
private Double lng;
/**
* 详细地址
*/
@SerializedName("detail_address")
private String detailAddress;
}

二、定义一个 TypeAdapter,用来处理 Double 类型的数据

/**
* 序列化和反序列化 Double 类型的数据
*
* @author huan.fu
* @date 2018/8/15 - 11:26
*/
public class DoubleTypeAdapter extends TypeAdapter<Double> {
/**
* 序列化操作
*
* @param out
* @param value
* @throws IOException
*/
@Override
public void write(JsonWriter out, Double value) throws IOException {
// 如果 value 没有值,那么不进行序列化
if (null == value) {
out.nullValue();
// 如果 value 的值为 0,那么输出0,不输出默认的 0.0
} else if (value.equals(0D)) {
out.value(0);
// 否则直接输出
} else {
out.value(value);
}
}
/**
* 反序列操作
*
* @param in
* @return
* @throws IOException
*/
@Override
public Double read(JsonReader in) throws IOException {
return null;
}
}

三、测试代码

       注意:TypeApapter 的使用,需要先进行注册,否则不生效。

/**
* 测试 gson 的 double 处理
*
* @author huan.fu
* @date 2018/8/15 - 10:53
*/
public class GsonTest { @Test
public void doubleGsonAdapterTest() {
Location location = Location.builder()
.lat(0D)
.lng(1.1D)
.detailAddress(null)
.build(); // 不使用 adapter 处理 double
System.out.println(new Gson().toJson(location));
System.out.println("=========================");
// 使用 adapter 处理 double
Gson gson = new GsonBuilder()
.registerTypeAdapter(Double.class, new DoubleTypeAdapter())
.create();
System.out.println(gson.toJson(location));
}
}

四、结果

gson中TypeAdapter实现自定义序列化操作的更多相关文章

  1. Python json.dumps 特殊数据类型的自定义序列化操作

    场景描述: Python标准库中的json模块,集成了将数据序列化处理的功能:在使用json.dumps()方法序列化数据时候,如果目标数据中存在datetime数据类型,执行操作时, 会抛出异常:T ...

  2. Python json.dumps 自定义序列化操作

    def login_ajax(request): if request.method == "GET": return render(request, 'login_ajax.ht ...

  3. c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

    https://www.cnblogs.com/yijiayi/p/10051284.html 相信大家在工作中会经常遇见对json进行序列化与反序列化吧,但通常的序列化与反序列化中的json结构与c ...

  4. Hive中自定义序列化器(带编码)

    hive SerDe的简介 https://www.jianshu.com/p/afee9acba686 问题 数据文件为文本文件,每一行为固定格式,每一列的长度都是定长或是有限制范围,考虑采用hiv ...

  5. mpi中利用自定义归约操作实现merge

    在归并排序中,很重要的一步是将两个排序数组合并成一个数组,这个操作叫merge.merge操作可以用来解决某些Top K问题. 问题描述 在哼唱搜索中,用户通过哼唱一个音乐片段去搜索与其相似的音乐.后 ...

  6. .Net Core 自定义序列化格式

    序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类 ...

  7. Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  8. 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization

    (  (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...

  9. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

随机推荐

  1. windows系统框架

  2. [闻缺陷则喜]关于boost的想法

    公司有个大约2万行的项目,用到了boost,我想取消掉不用boost.理由:一,可理解性差,除了高手很难弄懂.二,类太多,光头文件就1万多.大点的团队四五个高手,每人用一个boost类.高手流失后,很 ...

  3. 一起学习PHP中GD库的使用(一)

    又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎.从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们 ...

  4. Jmeter扩展组件开发(9) - 解决空指针问题

    问题分析 上一节https://www.cnblogs.com/gltou/p/14967005.html功能描述内容为空,导致Jmeter报空指针 CODE List desc = new Arra ...

  5. 代码扫描利器sonarqube

    sonar的作用 1.代码质量和安全扫描和分析平台. 2.多维度分析代码:代码量.安全隐患.编写规范隐患.重复度.复杂度.代码增量.测试覆盖率等. 3.支持25+编程语言的代码扫描口分析,包含java ...

  6. 微信小程序 创建自己的第一个小程序

    * 成为微信公众平台的开发者 注册 https://mp.weixin.qq.com * 登录 https://open.weixin.qq.com/ * 开发者工具下载 https://develo ...

  7. django中admin一些方法

    1.概述:内容发布,负责添加,修改,删除内容及公告访问2.配置admin应用在settings文件中INSTALLED_APPS添加:'django.contrib.admin', 默认是已经添加好的 ...

  8. NetCore5实现https请求

    前言 本文主要介绍在NetCore5中,实现证书加载和https访问请求. 证书准备 首先我们先创建一个自定义的证书Kiba518.pfx. 证书创建参考:最通俗易懂的RSA加密解密指导. 然后将证书 ...

  9. P4643-[国家集训队]阿狸和桃子的游戏【结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P4643 题目大意 给出\(n\)个点\(m\)条边的无向图,两个人轮流选择一个未被选择的点加入点集. 然后每个人的 ...

  10. 小白学习Python英语基础差怎么办,都帮你想好拉!看这里

    运算符与随机数 1.module:模块 2.sys(system):系统 3.path:路径 4.import:导入 5.from:从- 定义函数与设定参数 1.birthday:出生日期 2.yea ...