2011-11-25 153 views
84

我试图使用json包将Go结构转换为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 
{} 

回答

173

您需要exportUser.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"} 
+51

请注意,您可以在struct字段定义的末尾添加'\'json:“name”\''以保留输出名称。 – Dustin

+8

我明白了。我有点喜欢这种语言,但我认为一些语法元素走到了尽头。如果一个结构成员的名字决定了行为,那么这就错了。 – magiconair

+1

那么,名称决定行为可以辩论,如果它的好或不好:)但它确定可以很容易地知道,如果一个字段导出或不,而不必检查其他地方。 – Olof

4

STRUCT值编码为JSON对象。每个出口结构域成为 对象的成员,除非:

  • 领域的标签为“ - ”,或
  • 该字段为空,它的标签指定“omitempty”选项。

空值是假,0,任何零指针或接口值,并
任何阵列,切片,地图,或长度为零的字符串。该对象的默认
关键字符串是结构字段名称,但可以在结构
字段的标记值中指定。结构字段标记值中的“json”键是键名,后跟可选的逗号和选项。

22

相关的问题:

我遇到了麻烦,转换结构以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); 

希望这可以帮助别人。
祝你好运。