文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言实现JSON解析的神器详解

2023-01-29 12:02

关注

前言

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 倍之多

两个特点:

安装方式: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解析类型转换问题的同时,也能极大的提高我们开发效率。

收集到开源项目jinzaigo/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能很好的解决我们的痛点,并且比标准库执行速度还更快。

到此这篇关于Go语言实现JSON解析的神器详解的文章就介绍到这了,更多相关Go语言解析JSON内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯