Go 语言提供了 encoding/json 包来支持 JSON 数据的编解码操作。该包中提供了 Marshal 和 Unmarshal 函数,可实现将 struct 对象序列化成 JSON 字符串和将 JSON 字符串反序列化为 struct 对象的操作。下面我将详细讲解如何使用 encoding/json 包实现 JSON 字符串与各类 struct 的相互转换。
1. Struct 定义
在进行 JSON 编解码操作前,需要先定义需要进行 JSON 编解码的 struct 类型。下面是一个示例:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Height float64 `json:"height"`
}
在上述代码中,我们定义了一个名为 Person 的 struct 类型,该类型具有三个字段:Name、Age、Height。通过在字段后添加 json tag,我们可以实现将 struct 对象序列化为 JSON 字符串后该字段在 JSON 中的名称为 json tag 指定的值。在序列化时,JSON tag 对应的标签将作为 JSON 的 key 名,而字段的值则对应为相应的 value。
2. 编码 struct
要将 struct 对象编码为 JSON 字符串,需要使用 encoding/json 包中的 Marshal 函数。该函数需要一个 interface{} 类型(即可接受任何类型)的参数,并返回一个字节数组和一个错误对象。下面是一个将 struct 编码为 JSON 字符串的示例:
func main() {
p := Person{Name: "张三", Age: 18, Height: 1.75}
b, err := json.Marshal(p)
if err != nil {
println(err)
return
}
println(string(b))
}
运行以上代码,输出结果为:
{"name":"张三","age":18,"height":1.75}
在以上示例中,我们创建了一个 Person 对象,并通过 json.Marshal 将其编码为 JSON 字符串。编码后,Person 中的字段名称将会被映射为 JSON 对象中的 key 名称,输出结果即为 JSON 字符串。
3. 解码 JSON
要将 JSON 字符串解码为 struct 对象,需要使用 encoding/json 包中的 Unmarshal 函数。该函数需要一个字节数组和一个指向接受解码结果的类型指针。下面是一个将 JSON 字符串解码为 struct 对象的示例:
func main() {
var p Person
err := json.Unmarshal([]byte(`{"name":"李四","age":20,"height":1.8}`), &p)
if err != nil {
println(err)
return
}
fmt.Printf("%+v", p)
}
运行以上代码,输出结果为:
{Name:李四 Age:20 Height:1.8}
在以上示例中,我们定义了一个 Person 对象,通过 json.Unmarshal 将 JSON 字符串解码,并将解码结果存储在该对象中。解码后,每个 key 将会与 Person 结构体中的同名字段匹配,并将承载的值赋给这个变量。
4. 附加配置项
在上述示例中,struct 的字段名字在 JSON 中被映射为相应的 key 名称,如果我们想要让 JSON 含有不同于 struct 字段名称的 key 名称,可以使用 struct 的 tag 将其映射为不同的 key 名称。例如:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Height float64 `json:"height,omitempty"`
}
在上述代码中,我们通过 JSON tag 连同 omitempty,表示如果字段 Height 的值为 0 或者是这个值对应的类型的零值,则生成的 JSON 中将自动省略。
通过 JSON Tag ,我们能够十分方便地控制 struct 字段与 JSON 字符串的映射,使得我们在解码和编码操作中能够更加自如地操纵 JSON 字符串。
总结
通过本文的介绍,我们可以了解到 Go 语言中实现 JSON 字符串与各类 struct 相互转换的完整攻略。首先,我们需要定义需要进行 JSON 编解码的 struct 类型。在需要编码为 JSON 字符串时,我们使用 encoding/json 包中的 Marshal 函数;在需要将 JSON 字符串解码为 struct 对象时,我们使用 Unmarshal 函数。此外,我们还展示了一些 struct 标签用法,使得我们在解码和编码过程中能够更加方便地实现自己的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go如何实现json字符串与各类struct相互转换 - Python技术站