Go-SJSON 组件,JSON 动态修改新方案

在Go语言 json 处理领域,在 json 数据处理中,读取与修改是两个核心需求。前文介绍的 GJSON 解决了灵活读取问题,而 SJSON 作为其姊妹库,则专注于实现无需结构体定义的 json 动态修改。

本文将延续对比分析风格,解析 SJSON 的核心价值。

一、Go 原生 json 修改方式

Go 原生修改 json 数据,同样需先定义结构体,然后再将 json 数据解析到结构体实例,如:

go 复制代码
package main

import (
    "encoding/json"
    "fmt"
)

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

func main() {
    jsonStr := `{"name":"张三","age":25}`

    var person Person
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err != nil {
       fmt.Println("解析错误:", err)
       return
    }

    person.Age = 35
    newJson, _ := json.Marshal(person)

    fmt.Println(string(newJson))
}

二、SJSON 组件

1、概述:

SJSON 提供通过路径表达式直接修改 json 字符串的能力,与 GJSON 采用相同路径语法,形成读写闭环。

官网地址:GitHub - tidwall/sjson

2、安装:

使用 Go 的包管理工具 go get 安装 SJSON:

shell 复制代码
go get -u github.com/tidwall/sjson

三、SJSON核心用法

1、基础值修改

go 复制代码
package main

import (
    "fmt"
    "github.com/tidwall/sjson"
)

func main() {
    jsonStr := `{"name":"张三","age":25}`

    // 修改 age 值为 35
    newJson, _ := sjson.Set(jsonStr, "age", 35)

    fmt.Println(string(newJson))
}

2、嵌套结构修改

go 复制代码
package main

import (
    "fmt"
    "github.com/tidwall/sjson"
)

func main() {
    jsonStr := `{
       "name": "张三",
       "age": 25,
       "hobby": {
          "sing": "只因你太美",
          "dance": "背带裤",
          "rap": "kun",
          "ball": "篮球"
       }`

    // 修改 hobby.sing 的值: 只因你太美 => 重生
    newJson, _ := sjson.Set(jsonStr, "hobby.sing", "重生")

    fmt.Println(string(newJson))
}

3、数组操作

go 复制代码
package main

import (
    "fmt"
    "github.com/tidwall/sjson"
)

func main() {
    jsonStr := `{"hobby": ["sing","dance","rap","ball"]}`

    // 修改 hobby 数组第4个元素为 play
    newJson, _ := sjson.Set(jsonStr, "hobby.3", "play")

    fmt.Println(string(newJson))

    // 追加 hobby 数组第5个元素为 play
    newJson, _ = sjson.Set(jsonStr, "tags.-1", "play")
    fmt.Println(string(newJson))
}

4、字段删除

go 复制代码
package main

import (
    "fmt"
    "github.com/tidwall/sjson"
)

func main() {
    jsonStr := `{"name":"张三","age":25}`

    // 删除age字段
    newJson, _ := sjson.Delete(jsonStr, "age")

    fmt.Println(string(newJson))
}

四、SJSON 与原生方案对比

  • SJSON 摆脱结构体定义束缚,保持原始 json 结构完整性,避免修改后丢失未定义字段的问题。

  • SJSON 路径直达修改位置,规避嵌套结构嵌套带来的问题,与 GJSON 组成完整处理链路。

  • SJSON 支持运行时动态路径构建,避免硬编码路径带来的问题。

相关推荐
程序设计实验室22 分钟前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题30 分钟前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉2 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo2 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点3 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理
迷迭香与樱花3 天前
Gin 框架
go·gin
只是懒得想了3 天前
用Go通道实现并发安全队列:从基础到最佳实践
开发语言·数据库·golang·go·并发安全
fenglllle4 天前
使用fyne做一个桌面ipv4网段计算程序
开发语言·go
码界奇点5 天前
基于Wails框架的Ollama模型桌面管理系统设计与实现
go·毕业设计·llama·源代码管理
csdn_aspnet6 天前
Go语言常用算法深度解析:并发与性能的优雅实践
后端·golang·go