现有的模块只能处理固定格式的数组,也就是可以用一个结构 sruct 描述的数据结构,这些数据是由这种结构的数据排列而成。
事实上,很多 JSON 数据结构并不是固定的,例如语法树。
["Spp",["Rules",[["Assert","^"],["Rept",["+",["Branch",[["Rtoken","_"],["Ntoken","Spec"]]]]],["Assert","$"]]]]
大家有没有遇到过这种情况?如果遇到了,是如何解决的呢?
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
更多评论
这个模块也是用 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