4

I want to save some treenode data as json so that I can use it in a web client. The orginal data looks like this:

id  parentId    name        leaf
001 000 root            0
002 001 Shooping        0
003 002 Housewares  0
004 003 Kitchen     1
005 003 Officer     1
006 002 Remodeling  0
007 006 Retile kitchen  1
008 006 Paint bedroom   1
009 008 Ceiling         1   
010 006 Other       1
011 001 Misc        1

I want to the json file to look like this.

{
  "name": "root", 
  "children": [
    {
      "name": "Shopping", 
      "children": [
        {
          "name": "Housewares",
          "children": [
            {
              "name": "Kitchen",
              "leaf": "1"
            },
            {
              "name": "Officer",
              "leaf": "1"
            }
          ]
        },
        {
          "name": "Remodeling",
          "children": [
            {
              "name": "Retile kitchen",
              "leaf": "1"
            },
            {
              "name": "Paint bedroom",
              "children": [
                {
                  "name": "Ceiling",
                  "leaf": "1"
                }
              ]
            },
            {
              "name": "Other",
              "leaf": "1"
            }
          ]
        }
      ]
    },
    {
      "name": "Misc",
      "leaf": "1"
    }
  ]
}

So far I have this code but I am stumped by the AddtoJson() function.

package main
import (
    "fmt"
 "encoding/json"
)
type Node struct {
    ID string
    Name    string `json:"name"`
    Children []*Node  `json:"children"`
    Leaf  string    `json:"leaf"`
}
var rootNode *Node
func SaveTreetoJson(node []Node, parent string, depth int) {
    for _, r := range node {
        if r.parentID == parent {
            for i := 0; i < depth; i++ {
                AddtoJson(rootNode)//how to deal with the "AddtoJson" function  and the rootNode?
            }
            fmt.Print(r.Name, "\n\n")
            SaveTreetoJson(node, r.ID, depth+1)
        }
    }
}

func main() {
    data := []Node{
{"001","000","root","0"},
{"002","001","Shooping","0"},
{"003","002","Housewares","0"},
{"004","003","Kitchen","1"},
{"005","003","Officer","1"},
{"006","002","Remodeling","0"},
{"007","006","Retile kitchen","1"},
{"008","006","Paint bedroom","1"},
{"009","008","Ceiling","1"},    
{"010","006","Other","1"},
{"011","001","Misc","1"},
    }
    SaveTreetoJson(data, "root", 0)
 bytes, _:= json.Marshal(rootNode)
    fmt.Println(string(bytes)) 
}

Can anyone help me? Thanks!

1 Answer 1

5

Something along the lines of this :

type Node struct {
    Id       string  `json:"-"`
    ParentId string  `json:"-"`
    Name     string  `json:"name"`
    Leaf     string  `json:"leaf,omitempty"`
    Children []*Node `json:"children,omitempty"`
}

func (this *Node) Size() int {
    var size int = len(this.Children)
    for _, c := range this.Children {
        size += c.Size()
    }
    return size
}

func (this *Node) Add(nodes... *Node) bool {
    var size = this.Size();
    for _, n := range nodes {
        if n.ParentId == this.Id {
            this.Children = append(this.Children, n)
        } else { 
            for _, c := range this.Children {
                if c.Add(n) {
                    break
                }
            }
        }
    }
    return this.Size() == size + len(nodes)
}
Sign up to request clarification or add additional context in comments.

2 Comments

why not give a complete example? i am still stumped.
I gave you a complete example in the playbin, play.golang.org/p/VgQwNi8W8d the "this" link

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.