根据下面的代码,是否可以在对名字进行解组时转换名字?假设我希望它始终是小写的,无论它是不是实际的json.

type Person struct {
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
}

func main() {
    jsonText := GetJsonFromSomewhere()
    var v Person
    json.Unmarshal(jsonText, &v)
}

推荐答案

要做到这一点,一种方法是从encoding/json包创建实现Unmarshaler接口的自定义类型.Here's a link to this interface.在进行JSON反编组时,任何实现Unmarshaler的类型都可以用作 struct 字段的类型.在进行解组时,encoding/json将使用您实现的接口UnmarshalJSON函数将JSON字节转换为字段类型.

因此,您可以编写一个UnmarshalJSON函数,其中包括将字符串值更改为小写.

以下是一个例子,说明了这可能是什么样子:

type LowerCaseString string

func (l *LowerCaseString) UnmarshalJSON(bytes []byte) error {
    lowerCasedString := strings.ToLower(string(bytes))

    *l = LowerCaseString(lowerCasedString)

    return nil
}

然后,在您的struct for JSON映射中,您可以使用您的定制类型而不是string:

type Person struct {
    FirstName LowerCaseString `json:"first_name"`
    LastName  LowerCaseString `json:"last_name"`
}

如果解组到这个 struct 中,FirstName和LastName的值将被小写(还要注意,您需要将它们转换回string才能将它们用作string).

testJSON := `{"first_name" : "TestFirstNAME", "last_name": "TestLastNAME"}`
var result Person

err := json.Unmarshal([]byte(testJSON), &result)
if err != nil { /*handle the error*/ }

fmt.Println(result.FirstName) // prints "testfirstname"

var stringLastName string
stringLastName = string(result.LastName) // need to type convert from LowerCaseString to string

fmt.Println(stringLastName) // prints "testlastname"

Here is the above code running in Go Playground.

Go相关问答推荐

我不能让GIO画一个按钮

Go GORM创建表,但不创建列

如何预编译Golang标准库?

MaybeReadByte对通道的使用如何在Go中提供随机行为?

关于如何使用 Service Weaver 设置多个不同侦听器的问题

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

运行 Docker 容器 - X11 无法打开显示:0

优化方式中所有可能组合的字符串相似度

在 GoLang 中对自定义 struct 体数组进行排序

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

如何在 Go 中编写示例测试?

为什么 Go 被认为是部分抢占式的?

Golang invopop jsonschema 使用 if/then/else

对所有标志进行 ORing 的简短方法

Golang Echo Labstack 如何在模板视图中调用函数/方法

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

如何在 Unmarshal 中使用泛型(转到 1.18)

如何使用 context.WithCancel 启动和停止每个会话的心跳?

如何使用 fyne 避免 GUI 应用程序中的循环依赖?