Golang兼容php等弱类型语言(php等)返回的json格式,数字/字符串数字/空数组/空对象

来源:赵克立博客 分类: Go 标签:GOGO语法发布时间:2023-08-11 13:45:56最后更新:2024-04-19 16:44:37浏览:131
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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)

结果

2308111691732586620814.png


这里我们使用第三方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)

}

结果

2308111691732752929390.png


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python