gpt4 book ai didi

json - 如何使用 String() 方法将嵌入式结构正确序列化为 JSON 字符串?

转载 作者:IT王子 更新时间:2023-10-29 01:35:08 25 4
gpt4 key购买 nike

 package main

import (
"fmt"
"encoding/json"
)

type Ticket struct {
From string
To string
}

func (t Ticket) String() string {
return fmt.Sprintf("%s - %s", t.From, t.To)
}

type Passenger struct {
Name string `json:"Name"`
Tkt Ticket `json:"Ticket"`
}

func main() {
p := Passenger{}
p.Name = "John"
p.Tkt.From = "New York"
p.Tkt.To = "Washington"

buf, _ := json.Marshal(p)
fmt.Println(string(buf))
}

这段代码输出:

 {"Name":"John","Ticket":{"From":"New York","To":"Washington"}}

但是,使用 json.Marshal() 方法(对于复杂的结构很简单且友好),如何让它输出如下:

 {"Name":"John","Ticket":"New York - Washington"}

最佳答案

要生成 Go 值的 JSON 表示,encoding/json包检查该值是否实现了 json.Marshalerencoding.TextMarshaler接口(interface),如果是,则使用/调用它们(按此顺序)。这记录在 json.Marshal() :

Marshal traverses the value v recursively. If an encountered value implements the Marshaler interface and is not a nil pointer, Marshal calls its MarshalJSON method to produce JSON. If no MarshalJSON method is present but the value implements encoding.TextMarshaler instead, Marshal calls its MarshalText method and encodes the result as a JSON string.

json/encoding 包不关心 String() 方法。因此,如果您想控制值的 JSON 表示/输出(Ticket 结构),请在其上实现 json.Marshaler(您可以在其中调用 String () 根据您的喜好:

func (t Ticket) MarshalJSON() ([]byte, error) {
return []byte(`"` + t.String() + `"`), nil
}

然后输出将如你所愿:

{"Name":"John","Ticket":"New York - Washington"}

Go Playground 上试试.

需要注意的一件事:Ticket.String() 生成的string 是否包含引号 ",输出将变为无效的 JSON,或者更有可能 json.Marshal() 将返回错误。

要处理这种转义,最好/最简单的方法是使用 json 包本身:告诉它对 string 结果进行 JSON 编码>Ticket.String():

func (t Ticket) MarshalJSON() ([]byte, error) {
return json.Marshal(t.String())
}

现在如果我们这样测试它:

p.Name = "John"
p.Tkt.From = "New\" York" // CONTAINS QUOTE
p.Tkt.To = "Washington"

buf, err := json.Marshal(p)
fmt.Println(string(buf), err)

输出仍然是有效的 JSON(在 Go Playground 上尝试):

{"Name":"John","Ticket":"New\" York - Washington"} <nil>

关于json - 如何使用 String() 方法将嵌入式结构正确序列化为 JSON 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46764908/

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