2014-04-21 82 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