第三方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