Go中的自定义JSON映射函数
因此,我正在创建一个调用restful API的Go服务,我无法控制我调用的API 我知道Go在NewDecoder->Decode中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(也称为公共字段)。这带来了一个问题,因为我尝试使用的JSON如下所示:Go中的自定义JSON映射函数,json,go,unmarshalling,Json,Go,Unmarshalling,因此,我正在创建一个调用restful API的Go服务,我无法控制我调用的API 我知道Go在NewDecoder->Decode中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(也称为公共字段)。这带来了一个问题,因为我尝试使用的JSON如下所示: { "_next": "someValue", "data": [{/*a collection of objects*/}], "message": "success" } type Somethi
{
"_next": "someValue",
"data": [{/*a collection of objects*/}],
"message": "success"
}
type Something struct {
Next string `json:"_next"`
Data []interface{} `json:"data"`
Message string `json:"message"`
}
我该如何映射“\u next”
?用于在JSON中指定字段名。您在上面发布的JSON对象可以这样建模:
{
"_next": "someValue",
"data": [{/*a collection of objects*/}],
"message": "success"
}
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"
}`
输出(在上尝试):
还请注意,您也可以将其解组为映射或接口{}
值,因此您甚至不必创建结构,但使用它不会像使用结构那样方便:
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结构。在左侧粘贴JSON结构,将在右侧生成等效的Go类型,您可以将其粘贴到程序中 啊,太完美了,这正是我想要的。接下来,当我将这个对象序列化回json时,有没有办法更改字段名?就像从“disc_firstname”读取,然后序列化回json时,将其映射到“firstname”?@cDecker32标记中指定的名称将在封送和解封时使用。因此,无法为mashalling提供值,也无法为同一结构上的解封提供不同的值?@cDecker32不带标记。您可以实现
json.Marshaler
和json.Unmarshaler
来执行自定义转换,在它们中执行您想要的任何操作。