新聞中心
層級訪問
?gjson?支持對數(shù)據(jù)內容進行層級檢索訪問,層級分隔符號默認為”?.?“。該特性使得開發(fā)者可以靈活訪問未知的數(shù)據(jù)結構內容變得非常簡便。

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:做網(wǎng)站、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的卓資網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
示例1,基本使用
func main() {
data :=
`{
"users" : {
"count" : 2,
"list" : [
{"name" : "Ming", "score" : 60},
{"name" : "John", "score" : 99.5}
]
}
}`
if j, err := gjson.DecodeToJson(data); err != nil {
panic(err)
} else {
fmt.Println("John Score:", j.Get("users.list.1.score"))
}
// Output:
// John Score: 99.5
}可以看到,?gjson.Json?對象可以通過非常靈活的層級篩選功能(?j.GetFloat32("users.list.1.score")?)檢索到對應的變量信息。
示例2,自定義層級分隔符號
func main() {
data :=
`{
"users" : {
"count" : 2,
"list" : [
{"name" : "Ming", "score" : 60},
{"name" : "John", "score" : 99.5}
]
}
}`
if j, err := gjson.DecodeToJson(data); err != nil {
panic(err)
} else {
j.SetSplitChar('#')
fmt.Println("John Score:", j.Get("users#list#1#score"))
}
// Output:
// John Score: 99.5
}可以看到,我們可以通過?SetSplitChar?方法設置我們自定義的分隔符號。
示例3,處理鍵名本身帶有層級符號”.“的情況
func main() {
data :=
`{
"users" : {
"count" : 100
},
"users.count" : 101
}`
if j, err := gjson.DecodeToJson(data); err != nil {
glog.Error(gctx.New(), err)
} else {
j.SetViolenceCheck(true)
fmt.Println("Users Count:", j.Get("users.count"))
}
// Output:
// Users Count: 101
}運行之后打印出的結果為?101?。當鍵名存在”?.?“號時,我們可以通過?SetViolenceCheck?設置沖突檢測,隨后檢索優(yōu)先級將會按照:鍵名->層級,便并不會引起歧義。但是當沖突檢測開關開啟時,檢索效率將會變低,默認為關閉狀態(tài)。
注意事項
大家都知道,在GOlang里面,?map/slice?類型其實是一個”引用類型”(也叫”指針類型”),因此當你對這種類型的變量 鍵值對/索引項 進行修改時,會同時修改到其對應的底層數(shù)據(jù)。
從效率上考慮,?gjson?包某些獲取方法返回的數(shù)據(jù)類型為?map/slice?時,沒有對齊做值拷貝,因此當你對返回的數(shù)據(jù)進行修改時,會同時修改?gjson?對應的底層數(shù)據(jù)。
例如:
func main() {
jsonContent := `{"map":{"key":"value"}, "slice":[59,90]}`
j, _ := gjson.LoadJson(jsonContent)
m := j.Get("map")
mMap := m.Map()
fmt.Println(mMap)
// Change the key-value pair.
mMap["key"] = "john"
// It changes the underlying key-value pair.
fmt.Println(j.Get("map").Map())
s := j.Get("slice")
sArray := s.Array()
fmt.Println(sArray)
// Change the value of specified index.
sArray[0] = 100
// It changes the underlying slice.
fmt.Println(j.Get("slice").Array())
// output:
// map[key:value]
// map[key:john]
// [59 90]
// [100 90]
} 本文標題:創(chuàng)新互聯(lián)GoFrame教程:GoFramegjson-層級訪問
標題路徑:http://www.dlmjj.cn/article/dpsihis.html


咨詢
建站咨詢
