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) }
结果