在 go 中,你可以使用内置的 encoding/json 包来处理 json 格式数据。该包提供了函数和类型,使你能够将 json 数据解析为 go 对象(反序列化)或将 go 对象转换为 json 数据(序列化)。
下面是一些常见的 json 处理操作:
反序列化(解析 json)
使用 json.unmarshal 函数将 json 数据解析为 go 对象。该函数接受一个包含 json 数据的字节切片和一个指向目标 go 对象的指针,并将 json 数据映射到指定的 go 对象上。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
name string `json:"name"`
age int `json:"age"`
}
func main() {
jsondata := []byte(`{"name":"john", "age":30}`)
var person person
err := json.unmarshal(jsondata, &person)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println("name:", person.name)
fmt.println("age:", person.age)
}
序列化(将 go 对象转换为 json)
使用 json.marshal 函数将 go 对象转换为 json 数据。该函数接受一个 go 对象,并返回表示该对象的 json 字节切片。
package main
import (
"encoding/json"
"fmt"
)
type person struct {
name string `json:"name"`
age int `json:"age"`
}
func main() {
person := person{
name: "john",
age: 30,
}
jsondata, err := json.marshal(person)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println(string(jsondata))
}
处理嵌套结构和数组
在 go 中,你可以使用结构体嵌套和切片/数组来处理复杂的 json 数据结构。通过在结构体字段上添加 json 标签,可以指定 json 数据中的键名。
package main
import (
"encoding/json"
"fmt"
)
type address struct {
city string `json:"city"`
state string `json:"state"`
}
type person struct {
name string `json:"name"`
age int `json:"age"`
address []address `json:"address"`
}
func main() {
jsondata := []byte(`{"name":"john", "age":30, "address":[{"city":"new york","state":"ny"},{"city":"san francisco","state":"ca"}]}`)
var person person
err := json.unmarshal(jsondata, &person)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println("name:", person.name)
fmt.println("age:", person.age)
fmt.println("address:", person.address)
}
以上示例展示了如何在 go 中处理 json 数据。你可以根据实际需求定义自己的数据结构,并使用 json 标签进行字段映射。
读取 json 文件
- 使用 os 和 io/ioutil 包来读取 json 文件的内容,并将其存储为字节切片。
- 使用 json.unmarshal 函数将字节切片解析为 go 对象。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type person struct {
name string `json:"name"`
age int `json:"age"`
}
func main() {
file, err := os.open("data.json")
if err != nil {
fmt.println("error:", err)
return
}
defer file.close()
jsondata, err := ioutil.readall(file)
if err != nil {
fmt.println("error:", err)
return
}
var person person
err = json.unmarshal(jsondata, &person)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println("name:", person.name)
fmt.println("age:", person.age)
}
在上述示例中,我们打开名为 data.json 的 json 文件,并将其内容读取为字节切片。然后,我们使用 json.unmarshal 将字节切片解析为 person 对象。
写入 json 文件
- 使用 os 和 io/ioutil 包来创建或打开要写入的 json 文件。
- 使用 json.marshalindent 函数将 go 对象转换为带缩进的 json 字节切片。
- 使用 ioutil.writefile 函数将 json 字节切片写入 json 文件。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type person struct {
name string `json:"name"`
age int `json:"age"`
}
func main() {
person := person{
name: "john",
age: 30,
}
jsondata, err := json.marshalindent(person, "", " ")
if err != nil {
fmt.println("error:", err)
return
}
err = ioutil.writefile("output.json", jsondata, 0644)
if err != nil {
fmt.println("error:", err)
return
}
fmt.println("json file created.")
}
在上述示例中,我们创建一个名为 output.json 的 json 文件,并将 person 对象转换为带缩进的 json 字节切片。然后,我们使用 ioutil.writefile 将 json 字节切片写入文件。
到此这篇关于go语言中常用json处理操作小结的文章就介绍到这了,更多相关go json处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论