2011-11-25 138 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); 

希望這可以幫助別人。
祝你好運。