2013-01-21 40 views
2

我剛開始使用Google go語言,我試圖編寫一個簡單的程序從Facebook的圖形API獲取Json對象並對其進行解組。解組json錯誤,甚至提供了匹配的數據結構

根據文檔,http://golang.org/doc/articles/json_and_go.html,我應該提供匹配的數據結構,例如,如果JSON對象是:

{ 
    Name: "Alice" 
    Body: "Hello", 
    Time: 1294706395881547000, 
} 

的數據結構如下所示:

type Message struct { 
    Name string 
    Body string 
    Time int64 
} 

在我的情況下,我的json看起來像這樣:

{ 
    "id": "350685531728", 
    "name": "Facebook for Android", 
    "description": "Keep up with friends, wherever you are.", 
    "category": "Utilities", 
    "subcategory": "Communication", 
    "link": "http://www.facebook.com/apps/application.php?id=350685531728", 
    "namespace": "fbandroid", 
    "icon_url": "http://static.ak.fbcdn.net/rsrc.php/v2/yo/r/OKB7Z2hkREe.png", 
    "logo_url": "http://photos-b.ak.fbcdn.net/photos-ak-snc7/v43/207/227200684078827/app_115_227200684078827_474764570.png", 
    "company": "Facebook" 
} 

所以我提供了一個匹配的數據結構:

type Graph struct { 
    id string 
    name string 
    description string 
    category string 
    subcategory string 
    link string 
    namespace string 
    icon_url string 
    logo_url string 
    company string 
} 

這是代碼:

package main 

import "fmt" 
import "net/http" 
import "io/ioutil" 
import "encoding/json" 

type Graph struct { 
    id string 
    name string 
    description string 
    category string 
    subcategory string 
    link string 
    namespace string 
    icon_url string 
    logo_url string 
    company string 
} 

func main() { 
    fmt.Println("Hello, playground") 
    resp, err := http.Get("http://graph.facebook.com/android") 

    if err != nil { 
     fmt.Println("http.Get err: ",err)// handle error 
    } 

    defer resp.Body.Close() 
    body, err := ioutil.ReadAll(resp.Body) 

    fmt.Println("resp.Body: ", resp.Body) 
    fmt.Println("body: ",string(body)) 
    fmt.Println("err: ",err) 

    var g Graph 
    err = json.Unmarshal(body, &g) 
    if err == nil { 
     fmt.Println("graph: ", g) 
    } else { 
     fmt.Println("graph error: ",err) // <---error at this line 
    } 
} 

但我還是發現了以下錯誤:

graph error: json: cannot unmarshal object key "id" into unexported field id of type main.Graph 

任何想法?

謝謝!

回答

8

該字段id未導出,因爲它以小寫字母開頭。見Exported identifiers

+0

謝謝!現在正在工作。 –

12

所有給定的字段都是小寫字母,因此未導出。爲了解組結構,您需要使用tags

例如,在你的情況下,有效的結構將是

type Graph struct { 
    Id   string `json:"id"` 
    Name  string `json:"name"` 
    Description string `json:"description"` 
    Category string `json:"category"` 
    Subcategory string `json:"subcategory"` 
    Link  string `json:"link"` 
    Namespace string `json:"namespace"` 
    Icon_url string `json:"icon_url"` 
    Logo_url string `json:"logo_url"` 
    Company  string `json:"company"` 
} 

然而,由於該編碼/ JSON的行爲方式,(無鏈接,對不起,我是有點倉促, )你可能會完全沒有標籤。只要確保您的字段名稱已導出。

+0

感謝您的選擇,工作也是如此。 :) –

相關問題