gpt4 book ai didi

json - 为非内置类型定义自定义解码

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:45 25 4
gpt4 key购买 nike

我们大多数人都知道可以使用 JSON 标签解码 JSON 对象:

var jsonData = `{"name": "Brown Bear"}`

type Elephant struct {
Name string `json:"name"`
}

这是因为 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
}

有没有一种方法可以定义 Name 类型,以便 json 解码器知道如何解码它?

PS:我想避免的解决方案是为ElephantFelineBear 创建UnmarshalJSON 方法多于。最好只为 Name 类型创建一个方法。

最佳答案

参见 json.Marshalerjson.Unmarshaler encoding/json 包中的类型允许您为任意类型定义自定义 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}

关于json - 为非内置类型定义自定义解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47339542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com