前言近期会更新开源项目系列文章。新的一年,我们会和大家一起做更多的开源项目,欢迎大家的加入。今天分享的xutil文章来源于对开源项目jinzaigo/xutil的封装。封装过程中,今仔会体会其中的原理和相关实践思考,写文章分享,总结系列文章。PHP去。Jinzai和我都在从PHP转向Go。我们身边越来越多的PHP朋友也逐渐使用Go进行重构。)真香,弱类型语言中的各种隐式类型转换大大降低了程序的复杂度。另一方面,go使用的是标准库encoding/json,所以做json解析不是那么愉快(只要数据类型定义有误,就容易抛错)JSON解析实践案例:服务用go重构,对接的上游依然是php服务,此时php接口输出的json串为{"name":"AppleWatchS8","price":"3199"}。其中price字段应该是float类型的,但是由于PHP是弱类型语言,没有强制输出类型的机制,所以很容易出现错误的输出类型,那么如何处理呢在去服务?标准库encoding/jsonpackagemainimport("encoding/json""fmt")typeProductInfostruct{Namestring`json:"name"`Pricefloat32`json:"price"`}funcmain(){str:="{"name":"AppleWatchS8","price":"3199"}"data:=ProductInfo{}iferr:=json.Unmarshal([]byte(str),&data);err!=nil{fmt.Println("error:"+err.Error())}else{fmt.Println(data)}}//输出结果//错误:json:无法将字符串解组到Go结构字段ProductInfo。priceoftypefloat32显然,使用gostandardlibrary做json解析无法应对这种类型的不一致。下面借助第三方库的能力简单介绍一下第三方库json-iterator:执行速度:Golang版本的jsoniter可以比标准库快6倍之多(编码/json)特点二:完全兼容标准库,即API用法完全一样,原来的逻辑代码不用改,只需要更换导入包名一种PHP兼容模式提供,可以自动转换string/number弱类型,可以将空数组[]转换为空结构(解决PHP中数组输出为[]的问题)。注意安装需要手动开启此兼容模式:goget-ugithub.com/json-iterator/go具体代码实现:packagemainimport("fmt"jsoniter"github.com/json-iterator/go""github.com/json-iterator/go/extra")varjson=jsoniter.ConfigCompatibleWithStandardLibraryfuncinit(){extra.RegisterFuzzyDecoders()//启用PHP兼容模式}typeProductInfostruct{Namestring`json:"name"`Pricefloat32`json:"price"`}funcmain(){str:="{"name":"AppleWatchS8","price":"3199"}"data:=ProductInfo{}iferr:=json.Unmarshal([]字节(海峡),&数据);err!=nil{fmt.Println("error:"+err.Error())}else{fmt.Println(data)}}//输出结果//{AppleWatchS83199}查看输出结果,你会发现使用此库并打开PHP兼容模式。json中price字段的string类型会自动转换为结构体中定义的float32类型。这样我们在使用price字段处理业务逻辑的时候,只需要按照float32来处理即可,不需要进行类型断言。这个库在解决json解析和类型转换问题的同时,也可以大大提高我们的开发效率。开源工具包xutil收录的第三个库,用起来太方便了,必须包含,会替换包名,手动开启PHP兼容模式,常用的API方法(序列化和反序列化操作),统一打包以简化使用过程。同时为了方便后续扩展更多兼容模式,将代码放在xjson目录下。上面的思路也适用于大家封装自己内部的工具库。使用示例:goget-ugithub.com/jinzaigo/xutil后,导入github.com/jinzaigo/xutil/xjson,即可使用xjson.Unmarshal()等方法进行json解析操作。示例代码:packagemainimport("fmt""github.com/jinzaigo/xutil/xjson")typeProductInfostruct{Namestring`json:"name"`Pricefloat32`json:"price"`}funcmain(){str:="{"name":"AppleWatchS8","price":"3199"}"data:=ProductInfo{}iferr:=xjson.Unmarshal([]byte(str),&data);err!=nil{json解析错误的常见问题。使用第三方库json-iterator可以很好的解决我们的痛点,而且比标准库更快。包含在开源项目中,更好的帮助有需要的朋友,欢迎使用,star和PR共同建设。https://github.com/jinzaigo/x…
