将Go结构转换为JSON

我试图使用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
{}
390494 次浏览

你需要出口 User.name字段,这样json包才能看到它。将name字段重命名为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);

你可以定义自己的自定义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))
}


这是一个有趣的问题,使用新的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”。