返回顶部
首页 > 资讯 > 后端开发 > GO >golang jsoniter extension怎么处理动态字段
  • 903
分享到

golang jsoniter extension怎么处理动态字段

2023-07-05 22:07:39 903人浏览 独家记忆
摘要

这篇文章主要讲解了“golang JSONiter extension怎么处理动态字段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang jsonite

这篇文章主要讲解了“golang JSONiter extension怎么处理动态字段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang jsoniter extension怎么处理动态字段”吧!

1. 背景

golang 原生 json 包,在处理 json 对象的字段的时候,是需要严格匹配类型的。但是,实际上,当我们与一些老系统或者脚本语言的系统对接的时候,有时候需要对类型需要做一下兼容,假设我们有以下需求


目标类型输入解析后
intint, string123, “123”123
stringint, string123, “123”“123”
timeunix_seconds, RFC33391680676884, “2023-04-05T14:41:24Z”,“2023-04-05T14:41:24Z”

2. 可选项

我们以 time 作为一个样例

  • 包装类,然后重新实现 Unmarshal 接口

type MyTime struct {t    time.Time}

功能可以实现,但是如果使用的地方很多的情况下,就可能要改动多处,而且,这是全局级别的,可能会影响到很多包的行为

  • 使用 jsonter 的 extension 实现

jsoniter 的插件文档参考
我们使用实例级别的 extension, 而非全局,可以针对不同业务逻辑有所区分

package mainimport ("fmt""reflect""strconv""time""unsafe"jsoniter "GitHub.com/json-iterator/go""github.com/modern-go/reflect2")type sampleExtension struct {jsoniter.DummyExtension}type wrapEncoder struct {encodeFunc  func(ptr unsafe.Pointer, stream *jsoniter.Stream)isEmptyFunc func(ptr unsafe.Pointer) booldecodeFunc  func(ptr unsafe.Pointer, iter *jsoniter.Iterator)}func (enc *wrapEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {enc.encodeFunc(ptr, stream)}func (codec *wrapEncoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {codec.decodeFunc(ptr, iter)}func (enc *wrapEncoder) IsEmpty(ptr unsafe.Pointer) bool {if enc.isEmptyFunc == nil {return false}return enc.isEmptyFunc(ptr)}// 这里统一改用 unix seconds 进行输出func (e *sampleExtension) CreateEncoder(typ reflect2.Type) jsoniter.ValEncoder {if typ.Kind() == reflect.Struct && typ.Type1().PkgPath() == "time" && typ.String() == "time.Time" {return &wrapEncoder{func(ptr unsafe.Pointer, stream *jsoniter.Stream) {t := *(*time.Time)(ptr)data := strconv.Itoa(int(t.Unix()))stream.WriteRaw(data)},nil,nil,}}return nil}func (e *sampleExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder {if typ.Kind() == reflect.Struct && typ.Type1().PkgPath() == "time" && typ.String() == "time.Time" {return &wrapEncoder{decodeFunc: func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {switch iter.WhatIsNext() {case jsoniter.NumberValue: // 兼容 unix 数字解析timeUnix := iter.ReadInt()newTime := time.Unix(int64(timeUnix), 0)*(*time.Time)(ptr) = newTimecase jsoniter.NilValue:iter.Skip()case jsoniter.StringValue:timeStr := iter.ReadString()newTime, err := time.Parse(time.RFC3339, timeStr)if err != nil {fmt.Println("Unmarshal err", err)}*(*time.Time)(ptr) = newTime}},}}return nil}type Person struct {Birth time.Time `json:"birth"`}func main() {extension := &sampleExtension{}jsoniterapi := jsoniter.Config{}.Froze()jsoniterAPI.ReGISterExtension(extension)var p1 = Person{Birth: time.Now(),}j, err := jsoniterAPI.MarshalToString(p1)if err != nil {panic(err)}fmt.Println(j)var p2 Personerr = jsoniterAPI.Unmarshal([]byte(`{"birth": 1680254527}`), &p2)if err != nil {panic(err)}fmt.Println("p2", p2)var p3 Personerr = jsoniterAPI.Unmarshal([]byte(`{"birth": "2023-03-21T07:20:04+00:00"}`), &p3)if err != nil {panic(err)}fmt.Println("p3", p3)var p4 Personerr = jsoniterAPI.Unmarshal([]byte(`{"birth": null}`), &p4)if err != nil {panic(err)}fmt.Println("p4", p4)}

我们在例子中,实现了:

  • 把 p1 使用了 unix 数字进行序列化

  • 在反序列化 p2/p3/p4的时候,兼容了 字符串/数字/null

感谢各位的阅读,以上就是“golang jsoniter extension怎么处理动态字段”的内容了,经过本文的学习后,相信大家对golang jsoniter extension怎么处理动态字段这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: golang jsoniter extension怎么处理动态字段

本文链接: https://lsjlt.com/news/355719.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang jsoniter extension怎么处理动态字段
    这篇文章主要讲解了“golang jsoniter extension怎么处理动态字段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang jsonite...
    99+
    2023-07-05
  • golangjsoniterextension处理动态字段的实现方法
    目录1. 背景2. 可选项总结1. 背景 golang 原生 json 包,在处理 json 对象的字段的时候,是需要严格匹配类型的。但是,实际上,当我们与一些老系统或者脚本语言的系...
    99+
    2023-05-14
    go json动态字段 go 动态字段 go jsoniter extension
  • MySQL字段怎么处理
    这篇文章将为大家详细讲解有关MySQL字段怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。多个字段唯一性如何处理?情景有张表,表里有多个字段需要唯一,不能重复,否则...
    99+
    2024-04-02
  • Vue怎么动态生成数据字段
    本篇内容主要讲解“Vue怎么动态生成数据字段”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue怎么动态生成数据字段”吧!动态生成数据字段实例1.父组件定义data里面的数据字段异步请求获取数据...
    99+
    2023-06-29
  • mysql动态增添字段怎么实现
    今天小编给大家分享的是mysql动态增添字段怎么实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录数据库mybatis逆向工程新建springboot项目遇到的问题总结数据库--...
    99+
    2023-07-06
  • golang怎么创建字段
    在Golang中,字段是指结构体中的变量。结构体是一种自定义类型,可以包含多个不同的变量和常量,这些变量和常量被称为字段。在Golang中,通过使用结构体类型和字面值语法,可以轻松地创建和初始化结构体字段。创建结构体类型在Golang中,需...
    99+
    2023-05-14
  • Golang中如何处理动态接口类型?
    大家好,我们又见面了啊~本文《Golang中如何处理动态接口类型?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进...
    99+
    2024-04-05
  • mybatis动态字段查询的方法是什么
    MyBatis提供了动态字段查询的方法,可以根据不同的条件动态选择需要查询的字段。以下是MyBatis中实现动态字段查询的方法:1....
    99+
    2023-09-29
    mybatis
  • 利用Golang反射实现动态类型处理
    反射是 go 的一项功能,用于在运行时检查和修改类型,可用于动态类型处理。具体步骤包括:获取类型对象(reflect.type)、获取类型信息(名称、种类)、获取值反射值(reflect...
    99+
    2024-04-03
    golang
  • golang怎么爬取动态内容
    要爬取动态内容,你可以使用以下几种方法:1. 使用headless浏览器:可以使用一些基于Chrome或Firefox的headle...
    99+
    2023-08-08
    golang
  • Java中的静态字段和静态方法怎么用
    这篇文章主要介绍了Java中的静态字段和静态方法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先看看下面这一串代码:public class Mai...
    99+
    2023-06-29
  • MySql中怎么使用json_extract函数处理json字段
    这篇“MySql中怎么使用json_extract函数处理json字段”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySq...
    99+
    2023-06-30
  • go结构体动态添加字段的方法是什么
    在Go语言中,结构体是一种固定字段的数据类型,无法动态添加字段。这是因为Go语言是静态类型语言,所有的变量和字段必须在编译时确定。如...
    99+
    2023-10-10
    go
  • MyBatis中怎么处理动态表名和列名
    在MyBatis中处理动态表名和列名可以使用动态SQL语句和动态SQL标签来实现。以下是一个示例: 动态表名: <sele...
    99+
    2024-04-08
    MyBatis
  • golang动态执行代码怎么实现
    在Go语言中,可以使用reflect包来实现动态执行代码。下面是一个简单的示例: package main import ( ...
    99+
    2023-10-26
    golang
  • mysql日期字段的异常Data truncated for column怎么处理
    本篇内容介绍了“mysql日期字段的异常Data truncated for column怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
    99+
    2024-04-02
  • golang怎么处理异常
    Go语言是一门支持面向对象编程的静态类型编程语言,和其他的编程语言相比,它的确切名称应该是"Go"而非"golang"。Go语言始于2007年,是由Google公司开发的一种开源语言。在Go语言中,异常被称为“panic”,并不像Java或...
    99+
    2023-05-15
  • golang怎么处理图片
    随着互联网的快速发展,图片处理已经成为Web开发中不可避免的一环,Golang也不例外。Golang在图片处理方面已经拥有了非常丰富的工具,比如标准库中的image包、第三方库中的goimage、imagick等等。本文将详细介绍Golan...
    99+
    2023-05-15
  • mybatis 自动化处理 mysql 的json类型字段 终极方案
    文章目录 mybatis 自动化处理 mysql 的json类型字段 终极方案why json简介mysql 建表 json 字段,添加1条json 数据对应的java对象 `JsonEnti...
    99+
    2023-09-10
    mybatis mysql json
  • C#中怎么处理动态二维数组函数
    这篇文章将为大家详细讲解有关C#中怎么处理动态二维数组函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。对于C#动态二维数组函数处理方案理解我们引入一个例子来看看生活中,有很多事物,仅仅用一...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作