我们大多数人都知道 JSON 对象可以使用 JSON 标签进行解组:
var jsonData = `{"name": "Brown Bear"}`
type Elephant struct {
Name string `json:"name"`
}
Run Code Online (Sandbox Code Playgroud)
这是因为string是内置类型。但是,如果Name不是内置类型,并且我们想在不同的结构中使用此类型怎么办?
var jsonData = `{"name": "Brown Bear"}`
type Elephant struct {
Name Name `json:"name"` // Unmarshalling fails here
}
type Feline struct {
Name Name `json:"name"` // Unmarshalling fails here
}
type Bear struct {
Name Name `json:"name"` // Unmarshalling fails here
}
type Name struct {
CommonName string
ScientificName string // This field should intentionally be blank
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以定义类型,Name以便json解组器知道如何解组它?
PS:我想避免的解决方案是为、和以上创建UnmarshalJSON方法。最好只为该类型创建一个方法。ElephantFelineBearName
请参阅包中的json.Marshaler和类型,它们允许您为任意类型定义自定义 JSON 编码/解码函数。json.Unmarshalerencoding/json
package main
import (
"encoding/json"
"fmt"
)
type Name struct {
CommonName string
ScientificName string
}
func (n *Name) UnmarshalJSON(bytes []byte) error {
var name string
err := json.Unmarshal(bytes, &name)
if err != nil {
return err
}
n.CommonName = name
n.ScientificName = ""
return nil
}
type Elephant struct {
Name Name `json:"name"`
Age int `json:"age"`
}
func main() {
alice := Elephant{}
aliceJson := `{"name":"Alice","age":2}`
err := json.Unmarshal([]byte(aliceJson), &alice)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", alice)
}
// main.Elephant{Name:main.Name{CommonName:"Alice", ScientificName:""}, Age:2}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10179 次 |
| 最近记录: |