如果如下json string串,應如何遞回決議json string串
{"Name":"Wednesday", "Age":6, "Parents": [ "Gomez", "Moticia" ],"data":[{"a":"aa","b":"bb"},{"c":"cc"},{"list":["dd",1,"ff"]}]}
uj5u.com熱心網友回復:
自力更生吧 , 基本可以決議了。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)
}
uj5u.com熱心網友回復:
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)
}
}
uj5u.com熱心網友回復:
json的格式是固定的嗎?如果是,可以用結構體+json的tag,然后用"encoding/json"的Unmarshal方法uj5u.com熱心網友回復:
無論多復雜的json,都可以分解為map和切片陣列var p interface{}
err = json.Unmarshal(data, &p)
.......
uj5u.com熱心網友回復:
gjson 了解一下uj5u.com熱心網友回復:
我也想問,如果層級很深的Json,且沒有規律,那是不是每個層級都要事先定義好結構體,那也太麻煩了uj5u.com熱心網友回復:
所以一般都事先定義好schema,用schematyper等工具自動生成json結構體uj5u.com熱心網友回復:
jsonparser這個非常適合決議深層級的json
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142249.html
標籤:go語言
