Golang JSON解析技巧
我在使用Golang解析JSON时遇到了一些问题,想请教大家:
- 当JSON字段名和结构体字段名不一致时,除了用
json:"tag"标注外,还有其他处理方式吗? - 解析动态结构的JSON(比如某些字段可能不存在或类型不确定)有什么推荐的方法?
- 遇到大JSON文件时,如何优化解析性能避免内存占用过高?
- 需要处理特殊字符或非标准格式的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解析场景,根据需求选择合适的方法。

