2014-04-21 38 views
0

我有一个如下所示的树,并希望保存为json格式?让golang中的节点树成为json?

package main 
import ( "fmt") 
type Node struct { 
    Id string 
    Nodes []*Node 
} 

func main() { 
    node1 := Node{Id: "1"} 
    node2 := Node{Id:"2"} 
    node3 := Node{Id: "3"} 
    node4 := Node{Id: "4"} 
    node1.Nodes = append(node1.Nodes, &node2) 
    node2.Nodes = append(node2.Nodes, &node3) 
    node3.Nodes = append(node3.Nodes, &node4) 
    fmt.Printf("node1: %p %v \n", &node1, node1) 
} 

输出JSON我想是这样的,怎么办呢?:

{ 
    Id:"1", 
    Nodes:[ 
     Id:"2", 
     Nodes:[ 
       Id:"3", 
       Nodes:[Id:"4",Nodes:[]] 
       ], 
     ] 

} 
+0

这对我来说看起来不像是有效的json。那就是说,你看过[json.Marshal](http://golang.org/pkg/encoding/json/#Marshal)吗? – bereal

回答

1

下面的代码应该做你想要什么:

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
) 

type Node struct { 
    Id string 
    Nodes []*Node 
} 

func main() { 
    node1 := Node{Id: "1"} 
    node2 := Node{Id: "2"} 
    node3 := Node{Id: "3"} 
    node4 := Node{Id: "4"} 
    node1.Nodes = append(node1.Nodes, &node2) 
    node2.Nodes = append(node2.Nodes, &node3) 
    node3.Nodes = append(node3.Nodes, &node4) 
    fmt.Printf("node1: %p %v \n", &node1, node1) 

    bytes, err := json.Marshal(node1) 
    if err != nil { 
     log.Fatal(err) 
    } 

    fmt.Println(string(bytes)) 
} 

此代码将输出json像这样:

{ 
    "Id": "1", 
    "Nodes": [ 
    { 
     "Id": "2", 
     "Nodes": [ 
     { 
      "Id": "3", 
      "Nodes": [ 
      { 
       "Id": "4", 
       "Nodes": null 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

*请注意,如果节点字段没有节点对象,则该字段将作为结果json中的空值编组。如果您希望节点切片呈现为空白,则必须确保将它们初始化为空切片。

使用此代码在操场上玩here