Go语言中处理JSON字符串转换的常见方式
作者:学亮编程手记
这篇文章主要介绍了Go语言中处理JSON字符串转换的常见方法,这些方法覆盖了 Go 语言中处理 JSON 字符串的常见场景,你可以根据具体需求选择合适的方式,需要的朋友可以参考下
在 Go 语言中,处理 JSON 字符串数据主要有以下几种方式:
1. 将 JSON 字符串转换为结构体
package main
import (
"encoding/json"
"fmt"
"log"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
}
func main() {
jsonStr := `{"name":"张三","age":25,"email":"zhangsan@example.com"}`
var user User
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
log.Fatal("JSON 解析错误:", err)
}
fmt.Printf("姓名: %s, 年龄: %d, 邮箱: %s\n", user.Name, user.Age, user.Email)
}
2. 将 JSON 字符串转换为 map
func jsonToMap() {
jsonStr := `{"name":"李四","age":30,"hobbies":["读书","游泳"]}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
log.Fatal("JSON 解析错误:", err)
}
fmt.Println("姓名:", data["name"])
fmt.Println("年龄:", data["age"])
// 处理数组类型的值
if hobbies, ok := data["hobbies"].([]interface{}); ok {
fmt.Println("爱好:")
for _, hobby := range hobbies {
fmt.Println(" -", hobby)
}
}
}
3. 将结构体转换为 JSON 字符串
func structToJson() {
user := User{
Name: "王五",
Age: 28,
Email: "wangwu@example.com",
}
jsonBytes, err := json.Marshal(user)
if err != nil {
log.Fatal("JSON 编码错误:", err)
}
jsonStr := string(jsonBytes)
fmt.Println("JSON 字符串:", jsonStr)
}
4. 使用 json.RawMessage 处理未知结构的 JSON
func handleRawJSON() {
jsonStr := `{
"type": "user",
"data": {"name":"赵六","age":35},
"metadata": {"created_at":"2023-01-01"}
}`
var rawData map[string]json.RawMessage
err := json.Unmarshal([]byte(jsonStr), &rawData)
if err != nil {
log.Fatal("JSON 解析错误:", err)
}
// 根据类型动态解析
var typeStr string
json.Unmarshal(rawData["type"], &typeStr)
if typeStr == "user" {
var user User
json.Unmarshal(rawData["data"], &user)
fmt.Println("用户数据:", user)
}
}
5. 处理复杂的嵌套 JSON
type Address struct {
City string `json:"city"`
Country string `json:"country"`
}
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"`
Tags []string `json:"tags"`
}
func complexJSON() {
jsonStr := `{
"name": "钱七",
"age": 40,
"address": {
"city": "北京",
"country": "中国"
},
"tags": ["经理", "技术"]
}`
var person Person
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
log.Fatal("JSON 解析错误:", err)
}
fmt.Printf("姓名: %s\n年龄: %d\n城市: %s\n标签: %v\n",
person.Name, person.Age, person.Address.City, person.Tags)
}
6. 使用 json.Decoder 处理流式 JSON
func streamJSON() {
jsonStr := `{"name":"孙八","age":45}{"name":"周九","age":50}`
reader := strings.NewReader(jsonStr)
decoder := json.NewDecoder(reader)
for {
var user User
if err := decoder.Decode(&user); err != nil {
if err == io.EOF {
break
}
log.Fatal("解码错误:", err)
}
fmt.Printf("流式读取: %+v\n", user)
}
}
注意事项
- 字段标签:使用
json:"field_name"标签来指定 JSON 字段名 - 错误处理:始终检查
json.Unmarshal和json.Marshal的返回值 - 类型匹配:确保 JSON 数据类型与 Go 结构体字段类型匹配
- omitempty:使用
omitempty标签在序列化时忽略空值
常用技巧
// 美化输出 JSON
func prettyJSON() {
user := User{Name: "郑十", Age: 55}
jsonBytes, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(jsonBytes))
}
// 检查字段是否存在
func checkFieldExists() {
jsonStr := `{"name":"吴十一"}`
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
if age, exists := data["age"]; exists {
fmt.Println("年龄:", age)
} else {
fmt.Println("年龄字段不存在")
}
}
这些方法覆盖了 Go 语言中处理 JSON 字符串的常见场景,你可以根据具体需求选择合适的方式。
到此这篇关于Go语言中处理JSON字符串转换的常见方式的文章就介绍到这了,更多相关Go处理JSON字符串转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
