如何递归解析json string串

aree 2018-02-28 08:12:17
如果如下json string串,应如何递归解析json string串

{"Name":"Wednesday", "Age":6, "Parents": [ "Gomez", "Moticia" ],"data":[{"a":"aa","b":"bb"},{"c":"cc"},{"list":["dd",1,"ff"]}]}
...全文
1112 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
瑞卡哥哥 2019-10-22
  • 打赏
  • 举报
回复
jsonparser 这个非常适合解析深层级的json
qybao 2019-02-18
  • 打赏
  • 举报
回复
所以一般都事先定义好schema,用schematyper等工具自动生成json结构体
王桑的一天 2019-02-18
  • 打赏
  • 举报
回复
我也想问,如果层级很深的Json,且没有规律,那是不是每个层级都要事先定义好结构体,那也太麻烦了
黄袍披身 2019-02-16
  • 打赏
  • 举报
回复
gjson 了解一下
ying1234 2019-02-12
  • 打赏
  • 举报
回复
无论多复杂的json,都可以分解为map和切片数组

var p interface{}
err = json.Unmarshal(data, &p)
.......
qybao 2019-02-07
  • 打赏
  • 举报
回复
json的格式是固定的吗?如果是,可以用结构体+json的tag,然后用"encoding/json"的Unmarshal方法
aree 2018-03-01
  • 打赏
  • 举报
回复

package main

import (
	"fmt"
	"encoding/json"
)
func jsonArrayParse(vv []interface{}){
	for i, u := range vv {
		//var f1 interface{}
		switch vv1 := u.(type) {
		case string:
			fmt.Println(i, "[string_] :", u)
		case float64:
			fmt.Println(i, "[float64_]:", u)
		case bool:
			fmt.Println(i, "[bool_]:", u)
		case nil:
			fmt.Println(i, "[nil_]:", u)
		case []interface{}:
			fmt.Println(i, "[array_] :", u)
			jsonArrayParse(vv1)
		case interface{}:
			fmt.Println(i, "[interface_]:",u)
			m1 := u.(map[string]interface{})
			jsonObjectParse(m1)
		default:
			fmt.Println("  ", i, "[type?_]", u, ", ",vv1)
		}
	}
}

func jsonObjectParse(f interface{}){
	m := f.(map[string]interface{})
	for k, v := range m {
		switch vv := v.(type) {
		case string:
			fmt.Println(k, "[string] :", vv)
		case float64:
			fmt.Println(k, "[float64]:", vv)
		case bool:
			fmt.Println(k, "[bool]:", vv)
		case nil:
			fmt.Println(k, "[nil]:", vv)
		case []interface{}:
			fmt.Println(k, "[array]:")
			jsonArrayParse(vv)
		case interface{}:
			fmt.Println(k, "[interface]:",vv)
			m1 := v.(map[string]interface{})
			jsonObjectParse(m1)
		default:
			fmt.Println(k, "[type?]",vv)
		}
	}
}
func main() {
	jsonStr := []byte(`{"Name":"aree", "Age":18,"From": [ "SZ", "GD" ],"data":[{"a":"aa","b":null},{"c":[]},{"list":["dd",1,"650827..."]}]}`)
	//jsonStr := []byte(`[{"Name":"aree", "Age":18,"From": [ "SZ", "GD" ],"data":[{"a":"aa","b":null},{"c":[]},{"list":["dd",1,"ff"]}]}]`)

	if (strings.Index(string(jsonStr[:]), "[") == 0) {
		var f []interface{}
		err := json.Unmarshal(jsonStr, &f)
		if err != nil {
			fmt.Println(err)
		}
		jsonArrayParse(f)
	} else {
		var f interface{}
		err := json.Unmarshal(jsonStr, &f)
		if err != nil {
			fmt.Println(err)
		}
		jsonObjectParse(f)
	}
}
aree 2018-03-01
  • 打赏
  • 举报
回复
自力更生吧 , 基本可以解析了。 func jsonParse(f interface{}){ m := f.(map[string]interface{}) for k, v := range m { switch vv := v.(type) { case string: fmt.Println(k, "[string] :", vv) case float64: fmt.Println(k, "[float64]:", vv) case bool: fmt.Println(k, "[bool]:", vv) case nil: fmt.Println(k, "[nil]:", vv) case []interface{}: fmt.Println(k, "[array]:") for i, u := range vv { //var f1 interface{} switch vv1 := u.(type) { case string: fmt.Println(i, "[string_] :", u) case float64: fmt.Println(i, "[float64_]:", u) case bool: fmt.Println(i, "[bool_]:", u) case nil: fmt.Println(i, "[nil_]:", u) case []interface{}: fmt.Println(i, "[array_] :", u) //m1 := u.(map[string]interface{}) //jsonParse(u) case interface{}: fmt.Println(i, "[interface_]:",u) m1 := u.(map[string]interface{}) jsonParse(m1) default: fmt.Println(" ", i, "[type?_]", u, ", ",vv1) } } case interface{}: fmt.Println(k, "[interface]:",vv) m1 := v.(map[string]interface{}) jsonParse(m1) default: fmt.Println(k, "[type?]",vv) } } } func main() { b := []byte(`{"Name":"Wednesday", "Age":6,"Parents": [ "Gomez", "Moticia" ],"data":[{"a":"aa","b":"bb"},{"c":"cc"},{"list":["dd",1,"ff"]}]}`) var f interface{} err := json.Unmarshal(b, &f) if err != nil { fmt.Println(err) } jsonParse(f) }

2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧