Golang – 利用json-iterator库兼容解析PHP JSON空数组兼容

本文介绍了如何在Golang项目中利用json-iterator库实现与PHP的弱类型兼容,通过ConfigCompatibleWithStandardLibrary和extra包的FuzzyDecoders注册,解决了JSON解析中的字符串/数字转换和空数组问题,只需在main文件中初始化一次即可全局适用。
摘要由CSDN通过智能技术生成

第三方json-iterator库

项目地址:https://github.com/json-iterator/go

这个库有2个特点:

  • 完全兼容json标准库,也就是API用法完全一样,原有代码不需要改动。
  • 提供了一个兼容模式,可以自动转换字符串/数字弱类型问题,可以转换[]与{}弱类型问题(PHP中的array问题)。
package main
 
import (
	"fmt"
	jsoniter "github.com/json-iterator/go"
)
 
var json = jsoniter.ConfigCompatibleWithStandardLibrary
 
type StdStruct struct {
	Age int `json:"age"`
}
 
func main() {
	s := "{\"age\": \"10\"}"
 
	d := &StdStruct{}
 
	if err := json.Unmarshal([]byte(s), d); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(d.Age)
	}
}
  • 删除原先的import encoding/json标准库,引入jsoniter库。
  • 创建一个变量叫做json,取值自jsoniter.ConfigCompatibleWithStandardLibrary。

其他业务代码不需要调整,即可继续按照原先的json.Unmarshal等用法运行。

但是这样的代码仍旧会报错:

main.StdStruct.Age: readUint64: unexpected character: , error found in #9 byte of …|{“age”: “10”}|…, bigger context …|{“age”: “10”}|…

原因是我们需要手动开启PHP的兼容模式,否则默认只是兼容了json标准库,因此可以运行的代码如下:

package main

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

var json = jsoniter.ConfigCompatibleWithStandardLibrary

func init() {
	// RegisterFuzzyDecoders decode input from PHP with tolerance.
	//  It will handle string/number auto conversation, and treat empty [] as empty struct.
	extra.RegisterFuzzyDecoders()
}

type StdStruct struct {
	Age int `json:"age"`
}

func main() {
	s := "{\"age\": \"10\"}"

	d := &StdStruct{}

	if err := json.Unmarshal([]byte(s), d); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(d.Age)
	}
}

可以得到打印输出:

后记:我们只需要在main文件里通过init开启1次PHP兼容模式即可,后续引入的模块不需要重复开启。

来源:https://yuerblog.cc/2019/11/08/golang-%e5%88%a9%e7%94%a8json-iterator%e5%ba%93%e5%85%bc%e5%ae%b9%e8%a7%a3%e6%9e%90php-json/#comments

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值