Golang JSON解析技巧

我在使用Golang解析JSON时遇到了一些问题,想请教大家:

  1. 当JSON字段名和结构体字段名不一致时,除了用json:"tag"标注外,还有其他处理方式吗?
  2. 解析动态结构的JSON(比如某些字段可能不存在或类型不确定)有什么推荐的方法?
  3. 遇到大JSON文件时,如何优化解析性能避免内存占用过高?
  4. 需要处理特殊字符或非标准格式的JSON时,有哪些需要注意的坑?
    求有经验的大佬分享实用技巧!
2 回复

使用encoding/json包,推荐结构体标签json:"field"控制字段映射。处理动态JSON可用map[string]interface{}json.RawMessage延迟解析。注意字段导出(首字母大写)和omitempty标签忽略空值。

更多关于Golang JSON解析技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,JSON解析主要通过标准库encoding/json实现。以下是常用技巧和示例:

1. 基本解析

使用json.Unmarshal将JSON字节数组解析到结构体:

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    data := []byte(`{"name":"Alice","age":25}`)
    var user User
    err := json.Unmarshal(data, &user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v", user) // {Name:Alice Age:25}
}

2. 处理动态字段

使用map[string]interface{}解析未知结构的JSON:

data := []byte(`{"name":"Bob","height":180}`)
var result map[string]interface{}
json.Unmarshal(data, &result)
fmt.Println(result["name"]) // Bob

3. 流式解析

使用json.Decoder处理大文件或网络流:

jsonStream := `{"name":"Charlie"} {"name":"David"}`
decoder := json.NewDecoder(strings.NewReader(jsonStream))
for {
    var user User
    if err := decoder.Decode(&user); err == io.EOF {
        break
    } else if err != nil {
        log.Fatal(err)
    }
    fmt.Println(user.Name)
}

4. 忽略空字段

使用omitempty标签跳过空值:

type Profile struct {
    Email string `json:"email,omitempty"`
    Phone string `json:"phone,omitempty"`
}

5. 自定义解析

实现json.Unmarshaler接口处理特殊格式:

type CustomTime struct {
    time.Time
}

func (ct *CustomTime) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), `"`)
    t, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    ct.Time = t
    return nil
}

6. 处理嵌套结构

type Address struct {
    City string `json:"city"`
}
type Person struct {
    Name    string  `json:"name"`
    Address Address `json:"address"`
}

注意事项:

  • 确保结构体字段可导出(首字母大写)
  • 使用标签匹配JSON字段名
  • 检查Unmarshal返回的错误
  • 对于可选字段使用指针类型(如*string

这些技巧能覆盖大部分JSON解析场景,根据需求选择合适的方法。

回到顶部