PHP转Go实践:xjson解析神器「开源工具集」

news2024/11/16 0:51:20

前言

近期会更新一系列开源项目的文章,新的一年会和大家做更多的开源项目,也欢迎大家加入进来。

xutil

今天分享的文章源自于开源项目jinzaigo/xutil的封装。

在封装过程中,劲仔将实现原理以及相关实践思考,写成文章分享出来,从而汇总系列文章集合。

PHP转Go

我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

反观go使用标准库encoding/json,来做json解析就没有那么愉快了(只要数据类型定义不对,就很容易抛error)

JSON解析实践

案例:用go重构的服务,对接的上游还是php服务,这时php接口输出的json串为{"name":"AppleWatchS8","price":"3199"}

其中price字段应该得为float类型,但由于php弱类型语言,没有强制约束输出类型的机制,就很容易出现这种输出类型不对的情况,然后到go服务里得怎么处理呢?

标准库encoding/json

package main

import (
  "encoding/json"
  "fmt"
)

type ProductInfo struct {
  Name  string  `json:"name"`
  Price float32 `json:"price"`
}

func main() {
  str := "{"name":"AppleWatchS8","price":"3199"}"
  data := ProductInfo{}
  if err := json.Unmarshal([]byte(str), &data); err != nil {
    fmt.Println("error: " + err.Error())
  } else {
    fmt.Println(data)
  }
}

//输出结果
//error: json: cannot unmarshal string into Go struct field ProductInfo.price of type float32

显然,使用go标准库做json解析,是应对不了这种类型不一致的情况的。下面则借助第三方库的能力来做处理

第三方库json-iterator

简单介绍:

执行速度:jsoniter 的 Golang 版本可以比标准库(encoding/json)快 6 倍之多

两个特点:

  1. 完全兼容标准库,也就是API用法完全一样,原有逻辑代码不需要改动,只需要替换import包名

  2. 提供了一个PHP兼容模式,可以自动转换字符串/数字弱类型问题,可以将空数组[]转换为空结构体(解决PHP中的array输出为[]的问题)。注意,该兼容模式需要手动开启

安装方式:

go get -u github.com/json-iterator/go

具体代码实现:

package main

import (
  "fmt"
  jsoniter "github.com/json-iterator/go"
  "github.com/json-iterator/go/extra"
)

var json = jsoniter.ConfigCompatibleWithStandardLibrary

func init() {
  extra.RegisterFuzzyDecoders() //开启PHP兼容模式
}

type ProductInfo struct {
  Name  string  `json:"name"`
  Price float32 `json:"price"`
}

func main() {
  str := "{"name":"AppleWatchS8","price":"3199"}"
  data := ProductInfo{}
  if err := json.Unmarshal([]byte(str), &data); err != nil {
    fmt.Println("error: " + err.Error())
  } else {
    fmt.Println(data)
  }
}

//输出结果
//{AppleWatchS8 3199}

看输出结果,会发现用了这个库并且开启了PHP兼容模式,json中price字段string类型,就会自动转换为结构体中定义的float32类型。

这样我们在使用price字段处理业务逻辑时,就只需要按float32做处理就行,不用进行类型断言。这个库解决了json解析类型转换问题的同时,也能极大的提高我们开发效率。

收集到开源工具包xutil中

这个第三库用起来如此方便,那肯定是要收录进来的,将替换包名、手动开启PHP兼容模式、还有常用的API方法(系列化与反序列化操作),统一封装进来,简化使用流程。

同时,为了便于后续扩展更多的兼容模式,所以将代码都放在xjson目录下

以上这个思路也适用于大家封装自己内部使用的工具库。

使用示例:

go get -u github.com/jinzaigo/xutil之后,

import github.com/jinzaigo/xutil/xjson

即可通过xjson.Unmarshal()等方法,进行json解析操作。

示例代码:

package main

import (
  "fmt"
  "github.com/jinzaigo/xutil/xjson"
)

type ProductInfo struct {
  Name  string  `json:"name"`
  Price float32 `json:"price"`
}

func main() {
  str := "{"name":"AppleWatchS8","price":"3199"}"
  data := ProductInfo{}
  if err := xjson.Unmarshal([]byte(str), &data); err != nil {
    fmt.Println("error: " + err.Error())
  } else {
    fmt.Println(data)
  }
}

总结

业务系统从php转go,或go对接php服务,都会遇到这个因为数据类型不一致导致json解析错误的共性问题。

使用第三方库json-iterator能很好的解决我们的痛点,并且比标准库执行速度还更快。

收录到开源项目中,更好的帮助到需要的朋友。

一起学习

欢迎在CSDN私信我,也欢迎 加我好友 一起学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3学习——条件控制、循环语句与迭代器

目录 一、编程第一步——斐波那契数列 二、条件控制 (一)if/else语句 判断狗狗的年龄: (二)多层if/else嵌套 判断数字能否被2或3整除: (三)match...case匹配——python3中新增 根据数字判断星期: 三、循环语句 (一)while循环 1.循环…

Java:Idea创建项目和Spring工程基本使用

一、创建项目 1、创建新的空的项目: Empty Project–next 2、定义项目的名称,并指定位置 3、对项目进行设置,JDK版本、编译版本 4、添加模块信息 5、修改maven路径 6、项目目录结构 二、搭建Spring的框架 1、在核心配置文件中添加Spring的j…

C++11 并发指南五(stdcondition_variable 详解)

C11 并发指南五(std::condition_variable 详解) 文章目录C11 并发指南五(std::condition_variable 详解)std::condition_variable 类介绍std::condition_variable_any 介绍std::cv_status 枚举类型介绍std::notify_all_at_thread_exit前面三讲《 C11 并发指南二(std::thread 详…

二叉树简单解析(1)

🍀本人简介: 吉师大一最爱逃课的混子、 华为云享专家、阿里云专家博主、腾讯云自媒体分享计划博主、 华为MindSpore优秀开发者、迷雾安全团队核心成员,CSDN2022年运维与安全领域第15名 🍁本人制作小程序以及资源分享地址&#x…

英语学习打卡day7

2023.1.27 1.ironically adv.具有讽刺意味的是;反讽地,讽刺地 Ironically, his cold got better on the last day of his holiday. 2.bequeath vt.遗赠;把…遗赠给;把… .传给 (比give更正式) bequeath sb sth bequeath sth to sb Don’t bequeath the problem …

JDK17 || JDK 8 完美 卸载 教程 (Windows版)

文章目录一、卸载jdk程序1 . 找到控制面板2. 卸载程序3. 找到JDK 相关的程序4. 右键 选择卸载程序5. 下一步 选择 是6.下一步 选择 是二、安装 新版 JDK三、如果不想再使用jdk环境结语一、卸载jdk程序 1 . 找到控制面板 2. 卸载程序 3. 找到JDK 相关的程序 4. 右键 选择卸载程…

IDEA界面和控制台的滚动条颜色不明显?赶快换一个吧!

前言 不知道大家是否和我一样有这么一个烦恼: IDEA自带的滚动条颜色很暗,配上一些主题颜色搭配很难发现。 所以今天就想着怎么可以修改滚动条颜色,首先去网上搜了搜都是什么鼠标滚轮加shift滚动,一点也不实用 偶然看到了个不错的…

【青训营】Go的BenchMark的使用

本文内容总结于 字节跳动青年训练营 第五届后端组 Go自带了一些性能测试工具&#xff0c;其中BenchMark是较为重要的一个。 我们以计算斐波那契数列的示例来展示BenchMark的使用 package Benchmarkimport "testing"func Fib(n int) int {if n < 2 {return n}ret…

OpenCV-PyQT项目实战(1)安装与环境配置

本系列从零开始实战解说基于 PyQt5 的 OpenCV 项目开发。 欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;OpenCV导入图像 文章目录1. PyQt5 …

初识图像分类——K近邻法(cs231n assignment)

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机视觉》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 专栏系列文章 Cannot find reference ‘imread‘ in ‘init.py‘ error: (-209:Sizes of input arguments…

ppt神器islide 第1节 初步接触强大的工具-资源篇

ppt神器islide 第1节 初步接触强大的工具1 PPT大神的课程总结1.1 骨架篇1.2 色彩篇1.3 对齐篇1.4 对比篇1.5 修饰篇1.6 字体篇1.7 素材篇1.8 线条篇1.8.1 可以随意画线条&#xff0c;填充空白1.8.2 在字体上画线条&#xff0c;做成艺术字1.8.3 做对称线条&#xff0c;比如递进三…

[Vulnhub] DC-3

下载链接&#xff1a;DC-3 DC-3需要 把IDE里面的改成IDE 0:0 不然无法打开 知识点&#xff1a; Joomla cms 3.7.0 sql注入漏洞cmseek工具探测cms指纹john解密proc_popen反弹shellpython -m http.server开启http服务 & wget远程下载ubuntu16.0.4 Linux 4.4.0-21 系统漏…

使用OpenAI的Whisper 模型进行语音识别

语音识别是人工智能中的一个领域&#xff0c;它允许计算机理解人类语音并将其转换为文本。该技术用于 Alexa 和各种聊天机器人应用程序等设备。而我们最常见的就是语音转录&#xff0c;语音转录可以语音转换为文字记录或字幕。 wav2vec2、Conformer 和 Hubert 等最先进模型的最…

无穷小的比较——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是无穷小的比较&#xff0c;下面&#xff0c;就让我们一起进入高等数学的世界吧 回顾 定义 性质 定理 定理1&#xff1a; 定理2&#xff1a;等价无穷小替换定理 常用的等价无穷小 例题 小结 回顾 两个无穷小的商当然不一定还…

Android深入系统完全讲解(38)

9.6 配置 native 方法 9.6.1 CMakeLists.txt 文件中内容&#xff0c;配置生成一个 so 库add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native…

一刷代码随想录——数组

概念数组是存放在连续内存空间上的相同类型数据的集合连续&#xff1a;增删需移动后续元素&#xff0c;删除的本质是覆盖类型&#xff1a;相同用数组&#xff0c;不同用结构数组下标从0开始C中二维数组连续分布vector的底层实现是array&#xff0c;严格来讲vector是容器&#x…

C++11 并发指南四( 详解三 stdfuture stdshared_future)

C11 并发指南四( 详解三 std::future & std::shared_future) 文章目录C11 并发指南四( 详解三 std::future & std::shared_future)std::future 介绍std::future 成员函数std::shared_future 介绍std::future_error 介绍其他与 std::future 相关的函数介绍其他与 std::f…

SWIFT Framework .NET 2023.1 Crack

SWIFT 组件 SWIFT Components 多年来一直致力于银行机构软件、在线交易软件、CRM 和零售和商业解决方案中的计费应用程序&#xff0c;以及医药和高度关键任务的 24/7 运营应用程序。作为定制银行解决方案的开发商&#xff0c;SWIFT Components 拥有所有银行产品和部门的专业知识…

【python从零入门 | 03】基本数据类型之“除法“

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目

设置/恢复系统隐藏文件 - Windows系统

设置/恢复系统隐藏文件 - Windows系统前言普通隐藏文件显示文件设置/取消隐藏系统隐藏文件显示文件设置/取消隐藏前言 本文介绍Windows系统如何设置/恢复隐藏文件&#xff0c;隐藏文件包含普通隐藏文件和系统隐藏文件&#xff0c;系统隐藏文件一般是受保护的系统文件&#xff…