如何为Go结构创建JSON

时间:2014-06-11 16:44:14

标签: json go

我正在尝试使用Marshal函数从Go结构创建JSON。创建的JSON不包含Person结构 我错过了什么?

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":{}}

我在输出中没有看到Person http://golang.org/pkg/encoding/json/#Marshal

1 个答案:

答案 0 :(得分:9)

你错过了两件事。

  1. 只有公共字段可以封送到json。
  2. 写入json的名称是fieldd的名称。在这种情况下P为字段Person。
  3. 请注意,我将Fields名称更改为Person结构的大写,并添加了 ColorGroup 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"}}