GO 语言如何处理任意结构的 JSON 数据

ssqq · · 2691 次点击
package main import ( "fmt" "encoding/json" ) func main() { strJson := `["Spp",["Rules",[["Assert","^"],["Rept",["+",["Branch",[["Rtoken","_"],["Ntoken","Spec"]]]]],["Assert","$"]]]]` arr := []interface{}{} if err := json.Unmarshal([]byte(strJson), &arr); err != nil { fmt.Printf("unmarshal error:%v", err) } PrintJsonObj(arr, 0) } func PrintJsonObj(v interface{}, indent int) { switch _v := v.(type) { case []interface{}: fmt.Printf("%[2]*[1]s", "", indent) fmt.Printf("jsonArray:%q\n", _v) for _, av := range _v { PrintJsonObj(av, indent+1) } case map[string]interface{}: fmt.Printf("%[2]*[1]s", "", indent) fmt.Printf("jsonObj:%q\n", _v) for k, ov := range _v { fmt.Printf("%[2]*[1]s", "", indent+1) fmt.Printf("obj-key:%q\n", k) fmt.Printf("%[2]*[1]s", "", indent+1) fmt.Printf("obj-value:\n") PrintJsonObj(ov, indent+1) } default: fmt.Printf("%[2]*[1]s", "", indent) fmt.Printf("value:%q\n", _v) } }
#4
更多评论
可以通过 [gjson](https://github.com/tidwall/gjson) 来解析
#1
ssqq
快乐编程
这个模块也是用 go 自带的 json 模块扩展出来的,也是要提前知道结构或者是某个元素的值,才能获取 JSON 中的元素值。 ```go package main import "github.com/tidwall/gjson" const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` func main() { value := gjson.Get(json, "name.last") println(value.String()) } ``` JSON 本是一种可以容纳不同数据类型的数据结构,解析成 go 语言中的对应的数据结构后,构建和遍历都应当和内容无关,所以这个模块适用范围有限。 我心目中的模块应当是: ```go import "ejson" func main() { values := ejson.Values(json) if ejson.is_array(values) { for _, v := range ejson.values(json) { println(ejson.String(v)) } } println(ejson.String(values)) } ```
#2