Go 中的自定义 JSON 映射函数
Custom JSON mapping function in Go
所以我正在制作一个调用 restful API 的 Go 服务,我无法控制我正在调用的 API。
我知道 Go 在 NewDecoder->Decode 中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(又名 public 字段)。这会带来问题,因为我尝试使用的 JSON 看起来像这样:
{
"_next": "someValue",
"data": [{/*a collection of objects*/}],
"message": "success"
}
我到底要怎么映射 "_next"
?
使用tags指定JSON中的字段名称。您上面发布的 JSON 对象可以像这样建模:
type Something struct {
Next string `json:"_next"`
Data []interface{} `json:"data"`
Message string `json:"message"`
}
正在测试:
func main() {
var sg Something
if err := json.Unmarshal([]byte(s), &sg); err != nil {
panic(err)
}
fmt.Printf("%+v", sg)
}
const s = `{
"_next": "someValue",
"data": ["one", 2],
"message": "success"
}`
输出(在 Go Playground 上尝试):
{Next:someValue Data:[one 2] Message:success}
另请注意,您还可以解组为映射或 interface{}
值,因此您甚至不必创建结构,但使用起来不如结构方便:
func main() {
var m map[string]interface{}
if err := json.Unmarshal([]byte(s), &m); err != nil {
panic(err)
}
fmt.Printf("%+v", m)
}
const s = `{
"_next": "someValue",
"data": ["one", 2],
"message": "success"
}`
输出(在 Go Playground 上尝试):
map[_next:someValue data:[one 2] message:success]
标签将解决您的问题。
希望可以帮助到这里的其他人,您可以使用https://mholt.github.io/json-to-go/生成Go结构。在左边粘贴一个 JSON 结构,右边会生成等效的 Go 类型,你可以将其粘贴到你的程序中。
所以我正在制作一个调用 restful API 的 Go 服务,我无法控制我正在调用的 API。
我知道 Go 在 NewDecoder->Decode 中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(又名 public 字段)。这会带来问题,因为我尝试使用的 JSON 看起来像这样:
{
"_next": "someValue",
"data": [{/*a collection of objects*/}],
"message": "success"
}
我到底要怎么映射 "_next"
?
使用tags指定JSON中的字段名称。您上面发布的 JSON 对象可以像这样建模:
type Something struct {
Next string `json:"_next"`
Data []interface{} `json:"data"`
Message string `json:"message"`
}
正在测试:
func main() {
var sg Something
if err := json.Unmarshal([]byte(s), &sg); err != nil {
panic(err)
}
fmt.Printf("%+v", sg)
}
const s = `{
"_next": "someValue",
"data": ["one", 2],
"message": "success"
}`
输出(在 Go Playground 上尝试):
{Next:someValue Data:[one 2] Message:success}
另请注意,您还可以解组为映射或 interface{}
值,因此您甚至不必创建结构,但使用起来不如结构方便:
func main() {
var m map[string]interface{}
if err := json.Unmarshal([]byte(s), &m); err != nil {
panic(err)
}
fmt.Printf("%+v", m)
}
const s = `{
"_next": "someValue",
"data": ["one", 2],
"message": "success"
}`
输出(在 Go Playground 上尝试):
map[_next:someValue data:[one 2] message:success]
标签将解决您的问题。
希望可以帮助到这里的其他人,您可以使用https://mholt.github.io/json-to-go/生成Go结构。在左边粘贴一个 JSON 结构,右边会生成等效的 Go 类型,你可以将其粘贴到你的程序中。