I got nested JSON code like below, what looks like a tree, having multi-layer child node. So how unmarshall it in Go? Anyone has a good idea?
{
"name": "mark",
"sons": [
{
"name": "markson1"
},
{
"name": "markson2",
"sons": [
{
"name": "markson21",
"sons": [
{
"name": "markson211"
}
]
}
]
}
]
}
sorry for bothering you, I just resolved the problem by using recursive call. anyway, thx all.
here is my code:
func Unmarshal(j string) error {
obj, err := simplejson.NewJson([]byte(j))
if err != nil {
return err
}
foo := make(map[string]byte)
bar, err := recursion(foo, obj);
if err != nil {
return err
}
bar[obj.Get("name").MustString()]=0
fmt.Println(bar)
return nil
}
func recursion(foo map[string]byte, obj *simplejson.Json) (map[string]byte, error) {
if exist(obj) {
sonsObj := obj.Get("sons")
sons, err := sonsObj.Array()
if err != nil {
return nil, err
}
for key, _ := range sons {
obj = sonsObj.GetIndex(key)
n := obj.Get("name").MustString()
foo[n]=0
tmp, err := recursion(foo, obj)
if err != nil {
return nil, err
}
for k, _ := range tmp {
foo[k]=0
}
}
}
return foo, nil
}
func exist(obj *simplejson.Json) bool {
_, exist := obj.CheckGet("sons")
return exist
}
output:
map[mark:0 markson1:0 markson2:0 markson21:0 markson211:0]
--- PASS: TestUnmarshal (0.00s)
--- PASS: TestUnmarshal/#00 (0.00s)
PASS