我试图使用JSON包将Go结构转换为JSON,但我得到的只是{}。我确信这是很明显的事情,但我没有看到。

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func main() {
    user := &User{name:"Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Printf("Error: %s", err)
        return;
    }
    fmt.Println(string(b))
}

然后当我试图运行它时,我得到这个:

$ 6g test.go && 6l -o test test.6 && ./test 
{}

当前回答

结构值编码为JSON对象。每个导出的结构字段变成 对象的成员,除非:

字段的标记是“-”,或者 该字段为空,其标记指定了“omitempty”选项。

空值为false、0、任何nil指针或接口值,以及任何数组、切片、映射或长度为0的字符串。对象的默认键字符串是struct字段名,但可以在struct字段的tag值中指定。struct字段的标签值中的"json"键是键名,后面跟着一个可选的逗号和选项。

其他回答

你可以定义自己的自定义MarshalJSON和UnmarshalJSON方法,并有意地控制应该包含的内容,例如:

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    name string
}

func (u *User) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Name     string `json:"name"`
    }{
        Name:     "customized" + u.name,
    })
}

func main() {
    user := &User{name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}

您需要导出User.name字段,以便json包可以看到它。将名称字段重命名为name。

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string
}

func main() {
    user := &User{Name: "Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(b))
}

输出:

{"Name":"Frank"}

结构值编码为JSON对象。每个导出的结构字段变成 对象的成员,除非:

字段的标记是“-”,或者 该字段为空,其标记指定了“omitempty”选项。

空值为false、0、任何nil指针或接口值,以及任何数组、切片、映射或长度为0的字符串。对象的默认键字符串是struct字段名,但可以在struct字段的tag值中指定。struct字段的标签值中的"json"键是键名,后面跟着一个可选的逗号和选项。

相关问题:

我在将struct转换为JSON时遇到了麻烦,将其作为Golang的响应发送,然后,后来通过Ajax在JavaScript中捕获相同的内容。

浪费了很多时间,所以在这里张贴解决方案。

在去:

// web server

type Foo struct {
    Number int    `json:"number"`
    Title  string `json:"title"`
}

foo_marshalled, err := json.Marshal(Foo{Number: 1, Title: "test"})
fmt.Fprint(w, string(foo_marshalled)) // write response to ResponseWriter (w)

在JavaScript中:

// web call & receive in "data", thru Ajax/ other

var Foo = JSON.parse(data);
console.log("number: " + Foo.number);
console.log("title: " + Foo.title);

这是一个有趣的问题,使用新的go版本非常容易。你应该这样做:

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string `json:"name"`
}

func main() {
    user := &User{name:"Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Printf("Error: %s", err)
        return;
    }
    fmt.Println(string(b))
}

修改为“name”。