Golang兼容php等弱类型语言(php等)返回的json格式,数字/字符串数字/空数组/空对象
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2024-04-19 16:44:37
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
在php中 {"age":"18"} {"age":18} 这两种格式都是可以被正常解析的,但在go语言的json解析标准库中是要先定义字段类型然后才能反解析,如下
type Person struct {
Age int`json:"age"`
}age定义的是数字,反解析到结构体时就会报错,json: cannot unmarshal string into Go struct field Person.age of type int &{0}
示例
jsonStr1 := []byte(`{"age":18}`)
jsonStr2 := []byte(`{}`)
jsonStr3 := []byte(`{"age":"18"}`)
jsonStr4 := []byte(`[]`)
type Person struct {
Age int `json:"age"`
}
person1 := &Person{}
person2 := &Person{}
person3 := &Person{}
person4 := &Person{}
// 兼容数字/字符串数字/空数组/空对象转换
//var json = jsoniter.ConfigCompatibleWithStandardLibrary
//extra.RegisterFuzzyDecoders()
err := json.Unmarshal(jsonStr1, person1)
fmt.Println(err, person1)
err = json.Unmarshal(jsonStr2, person2)
fmt.Println(err, person2)
err = json.Unmarshal(jsonStr3, person3)
fmt.Println(err, person3)
err = json.Unmarshal(jsonStr4, person4)
fmt.Println(err, person4)结果

这里我们使用第三方json解析库来兼容这种格式的解析, 使用上面代码中注释的部分来解析,完整测试如下
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
"github.com/json-iterator/go/extra"
"testing"
)
func init() {
// 特别注意下面一行,初始化一次即可,在多线程中重复调用会报错
extra.RegisterFuzzyDecoders()
}
func TestOther(t *testing.T) {
jsonStr1 := []byte(`{"age":18}`)
jsonStr2 := []byte(`{}`)
jsonStr3 := []byte(`{"age":"18"}`)
jsonStr4 := []byte(`[]`)
type Person struct {
Age int `json:"age"`
}
person1 := &Person{}
person2 := &Person{}
person3 := &Person{}
person4 := &Person{}
// 兼容数字/字符串数字/空数组/空对象转换
var json = jsoniter.ConfigCompatibleWithStandardLibrary
err := json.Unmarshal(jsonStr1, person1)
fmt.Println(err, person1)
err = json.Unmarshal(jsonStr2, person2)
fmt.Println(err, person2)
err = json.Unmarshal(jsonStr3, person3)
fmt.Println(err, person3)
err = json.Unmarshal(jsonStr4, person4)
fmt.Println(err, person4)
}结果
