Golang中的自定义json序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang中的自定义json序列化相关的知识,希望对你有一定的参考价值。

参考技术A 后端开发人员跟前端对接接口的时候,或多或少都会面临一些沟通问题,比如说枚举字符的定义,比如有整形状态字段: state

通常给前端的时候,前段要做的是将1,2,3以及对应的中文释义存储为key/value的形式,key与value单看都无法知道对方的语义,
比如我只知道状态值为“1”, 是无法将其与“成功”对应起来的(当然这套状态的设计者肯定是知道的),后端通常给到前端的restful api
接口定义也是key/value的形式,这乍一看其实也没啥毛病,只要有key/value也没问题,后端定义通常会是

但数字的表现形式终归是不不太明确的,如果对状态的定义换成以下形式:

基本可以理解为中英文互译了,理解起来也会更清晰一些不是,如果这么做的话,后端给到前端的响应字段状态的类型就需要修改成字符器格式

后端还是要做一层字符串到整型的转换,从目的来讲,我们只是想返给前端的 state 字段是字符串而已,也就是在做json序列化的时候将整型与字符串做一层转换,有更优雅的做法如下所示

只需要做两件事,自定义类型 MyState ,实现 MarshalJSON 方法

只要类型实现了 MarshalJSON 方法,在json序列化时就会调用此方法,如此一来,我们就轻松实现了自定义json序列化,反序列化同样如此

实现起来也很简单

需要注意的是, UnmarshalJSON 方法操作过程需要给 receiver 也就是 u 赋值,所以必须是指针类型,同样的,在实现
MarshalJSON 方法, receiver 的类型需要与结构体定义中的类型保持一致,否则自定义序列化会失败

参考:

Java 数据类型的自定义 JSON 序列化

【中文标题】Java 数据类型的自定义 JSON 序列化【英文标题】:Custom JSON serialization for Java datatypes 【发布时间】:2017-02-05 07:24:58 【问题描述】:

在 MobileFirst Foundation 8.0 中,是否有任何挂钩点可以为 Java 适配器中的 Java 数据类型添加自定义 JSON 序列化?

例如:在 pojo 类中使用 Date 对象,这将被序列化为默认格式“2016-09-27T12:11:17.430Z”。我只需要序列化它以显示日期值,剥离时间相关信息。

【问题讨论】:

【参考方案1】:

你看过@JsonFormat JAX-RS annotation吗?从它的描述来看:

通用注释,用于配置属性值如何序列化的详细信息。与大多数其他 Jackson 注释不同,注释没有特定的通用解释:相反,效果取决于被注释的属性的数据类型(或者更具体地说,使用的反序列化器和序列化器)。

Java 适配器本质上是JAX-RS applications,你可以添加注解...

【讨论】:

以上是关于Golang中的自定义json序列化的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个键值条目的 JSON 对象反序列化为 Rust 中的自定义结构

Java 数据类型的自定义 JSON 序列化

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

NewtonsoftJson 中的自定义 JSONConverter 用于序列化

序列化 DRF 中的自定义相关字段

SQLAlchemy 中 JSON 列的自定义 json 序列化程序