Golang JSON处理大全

在Golang中处理JSON时遇到几个问题想请教:

  1. 如何将一个结构体序列化成JSON字符串?能否自定义字段名称?
  2. 反序列化JSON时,如果字段不匹配或缺少字段该怎么处理?
  3. 处理复杂嵌套的JSON数据有什么推荐的方法或技巧?
  4. 性能优化方面,对于大量JSON数据的解析有什么最佳实践?
  5. 标准库的encoding/json和第三方库如json-iterator有什么区别?该如何选择?
2 回复

Golang中JSON处理常用方法:

  1. 序列化:json.Marshal() 将结构体转为JSON
  2. 反序列化:json.Unmarshal() 将JSON转为结构体
  3. 标签:使用json:"field"控制字段名
  4. 流式处理:json.Encoder/Decoder处理大文件
  5. 第三方库:如json-iterator提升性能

注意处理空值、嵌套结构和自定义类型转换。

更多关于Golang JSON处理大全的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang JSON处理大全

编码(序列化)

结构体转JSON

type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email,omitempty"`
}

user := User{Name: "Alice", Age: 25}
data, err := json.Marshal(user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // {"name":"Alice","age":25}

美化输出

data, err := json.MarshalIndent(user, "", "  ")

解码(反序列化)

JSON转结构体

jsonStr := `{"name":"Bob","age":30}`
var user User
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(user.Name) // Bob

流式处理

编码器

file, _ := os.Create("user.json")
encoder := json.NewEncoder(file)
encoder.SetIndent("", "  ")
encoder.Encode(user)

解码器

file, _ := os.Open("user.json")
decoder := json.NewDecoder(file)
var user User
decoder.Decode(&user)

处理动态JSON

interface{}处理未知结构

var data map[string]interface{}
jsonStr := `{"name":"Charlie","details":{"city":"NYC"}}`
json.Unmarshal([]byte(jsonStr), &data)

name := data["name"].(string)
details := data["details"].(map[string]interface{})
city := details["city"].(string)

json.RawMessage延迟解析

type Message struct {
    Type string          `json:"type"`
    Data json.RawMessage `json:"data"`
}

自定义编解码

实现MarshalJSON/UnmarshalJSON

type CustomTime struct {
    time.Time
}

func (ct *CustomTime) MarshalJSON() ([]byte, error) {
    return []byte(`"` + ct.Format("2006-01-02") + `"`), nil
}

func (ct *CustomTime) UnmarshalJSON(data []byte) error {
    // 自定义解析逻辑
}

常用技巧

  1. omitempty: 空值字段不输出
  2. -: 忽略字段 json:"-"
  3. string: 数字转字符串 json:"id,string"
  4. 处理HTML字符: json Encoder.SetEscapeHTML(false)

性能优化

  • 对于大量数据,使用流式处理
  • 避免频繁的反射,预定义结构体
  • 使用json-iterator/go等第三方库提升性能

这些是Golang JSON处理的核心功能,涵盖了日常开发中的大部分使用场景。

回到顶部