Go通過(guò)SJSON實(shí)現(xiàn)動(dòng)態(tài)修改JSON
在Go語(yǔ)言 json 處理領(lǐng)域,在 json 數(shù)據(jù)處理中,讀取與修改是兩個(gè)核心需求。前文介紹的 GJSON 解決了靈活讀取問(wèn)題,而 SJSON 作為其姊妹庫(kù),則專注于實(shí)現(xiàn)無(wú)需結(jié)構(gòu)體定義的 json 動(dòng)態(tài)修改。
本文將延續(xù)對(duì)比分析風(fēng)格,解析 SJSON 的核心價(jià)值。
一、Go 原生 json 修改方式
Go 原生修改 json 數(shù)據(jù),同樣需先定義結(jié)構(gòu)體,然后再將 json 數(shù)據(jù)解析到結(jié)構(gòu)體實(shí)例,如:
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("解析錯(cuò)誤:", err)
return
}
person.Age = 35
newJson, _ := json.Marshal(person)
fmt.Println(string(newJson))
}
二、SJSON 組件
1、概述
SJSON 提供通過(guò)路徑表達(dá)式直接修改 json 字符串的能力,與 GJSON 采用相同路徑語(yǔ)法,形成讀寫(xiě)閉環(huán)。
官網(wǎng)地址:GitHub - tidwall/sjson
2、安裝
使用 Go 的包管理工具 go get 安裝 SJSON:
go get -u github.com/tidwall/sjson
三、SJSON核心用法
1、基礎(chǔ)值修改
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、嵌套結(jié)構(gòu)修改
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、數(shù)組操作
package main
import (
"fmt"
"github.com/tidwall/sjson"
)
func main() {
jsonStr := `{"hobby": ["sing","dance","rap","ball"]}`
// 修改 hobby 數(shù)組第4個(gè)元素為 play
newJson, _ := sjson.Set(jsonStr, "hobby.3", "play")
fmt.Println(string(newJson))
// 追加 hobby 數(shù)組第5個(gè)元素為 play
newJson, _ = sjson.Set(jsonStr, "tags.-1", "play")
fmt.Println(string(newJson))
}
4、字段刪除
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 與原生方案對(duì)比
- SJSON 擺脫結(jié)構(gòu)體定義束縛,保持原始 json 結(jié)構(gòu)完整性,避免修改后丟失未定義字段的問(wèn)題。
- SJSON 路徑直達(dá)修改位置,規(guī)避嵌套結(jié)構(gòu)嵌套帶來(lái)的問(wèn)題,與 GJSON 組成完整處理鏈路。
- SJSON 支持運(yùn)行時(shí)動(dòng)態(tài)路徑構(gòu)建,避免硬編碼路徑帶來(lái)的問(wèn)題。
到此這篇關(guān)于Go通過(guò)SJSON實(shí)現(xiàn)動(dòng)態(tài)修改JSON的文章就介紹到這了,更多相關(guān)Go動(dòng)態(tài)修改JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于context.Context的Golang?loader緩存請(qǐng)求放大問(wèn)題解決
這篇文章主要為大家介紹了基于context.Context的Golang?loader緩存請(qǐng)求放大解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
go語(yǔ)言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法
這篇文章主要介紹了go語(yǔ)言使用pipe讀取子進(jìn)程標(biāo)準(zhǔn)輸出的方法,實(shí)例分析了Go語(yǔ)言針對(duì)進(jìn)程操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
Go語(yǔ)言實(shí)現(xiàn)Snowflake雪花算法
雪花算法產(chǎn)生的背景當(dāng)然是twitter高并發(fā)環(huán)境下對(duì)唯一ID生成的需求,得益于twitter內(nèi)部牛的技術(shù),雪花算法能夠流傳于至今并且被廣泛使用,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-06-06
Go語(yǔ)言resty http包調(diào)用jenkins api實(shí)例
這篇文章主要為大家介紹了Go語(yǔ)言resty http包調(diào)用jenkins api實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

