2014-06-11 142 views
2

我正嘗試使用Marshal函數從Go結構創建JSON。所創建的JSON不包含Person結構。
我錯過了什麼?如何爲Go創建JSON結構

http://play.golang.org/p/ASVYwDM7Fz

type Person struct { 
    fn string 
    ln string 
} 
type ColorGroup struct { 
    ID  int 
    Name string 
    Colors []string 
    P  Person 
} 

per := Person{ 
    fn: "John", 
    ln: "Doe", 
} 

group := ColorGroup{ 
    ID:  1, 
    Name: "Reds", 
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, 
    P:  per, 
} 
b, err := json.Marshal(group) 
if err != nil { 
    fmt.Println("error:", err) 
} 
os.Stdout.Write(b) 

產生的輸出如下:

{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"],"P":{}} 

我沒有看到人在輸出中。
http://golang.org/pkg/encoding/json/#Marshal

+0

可能重複http://stackoverflow.com/questions/15452004/my-structures-are -not-marshalling-into-json) –

回答

6

你錯過了兩件事。

  1. 只有公共字段可以被編組爲json。
  2. 寫入json的名稱是fieldd的名稱。在這種情況下,P爲字段Person。我改變了字段名稱

通知是資本的Person struct和我添加 的顏色組結構一個tag JSON表明,我想那場與另一名被序列化。標記大部分字段並將名稱更改爲小寫以與javascript風格同步很常見。

http://play.golang.org/p/HQQ8r8iV7l

package main 

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

func main() { 
type Person struct { 
    Fn string 
    Ln string 
} 
type ColorGroup struct { 
    ID  int 
    Name string 
    Colors []string 
    P Person `json:"Person"` 
} 

per := Person{Fn: "John", 
      Ln: "Doe", 
    } 

group := ColorGroup{ 
    ID:  1, 
    Name: "Reds", 
    Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, 
    P: per, 
} 
b, err := json.Marshal(group) 
if err != nil { 
    fmt.Println("error:", err) 
} 
os.Stdout.Write(b) 
} 

威爾輸出

{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"],"Person":{"Fn":"John","Ln":"Doe"}} 
的[我結構沒有編組爲JSON(
+0

感謝您的回答。通過使用大寫,舊Java習慣錯過了公/私的區別... – user1848653