2010-03-08 72 views
5

我與Twitter的API的工作,試圖讓JSON數據從基本JSON>結構問題(使用 '去')

http://search.twitter.com/trends/current.json 

它看起來像:

{"as_of":1268069036,"trends":{"2010-03-08 17:23:56":[{"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},{"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"},{"name":"Oscars","query":"Oscars OR #oscars"},{"name":"#nooffense","query":"#nooffense"},{"name":"Hurt Locker","query":"\"Hurt Locker\""},{"name":"Justin Bieber","query":"\"Justin Bieber\""},{"name":"Cmon","query":"Cmon"},{"name":"My World 2","query":"\"My World 2\""},{"name":"Sandra Bullock","query":"\"Sandra Bullock\""}]}} 

我的結構看像:

type trend struct { 
name string 
query string 
} 

type trends struct { 
id string 
arr_of_trends []trend 
} 

type Trending struct { 
as_of string 
trends_obj trends 
} 

然後我解析JSON到Trending類型的變量。我對JSON非常陌生,所以我主要關心的是確保我已經正確設置了數據結構來保存返回的json數據。

我在'去'寫這個項目給學校。 (這不是特定任務的一部分,只是我正在演示該語言的演示文稿)

更新:根據PeterSO的評論,我正在使用正則表達式路由。使用:

Cur_Trends := new(Current) 
/* unmarshal the JSON into our structures */ 

//find proper json time-name 
aoUnixTime, _, _ := os.Time() 

// insert code to find and convert as_of Unix time to aoUnixTime 
    aoName := time.SecondsToUTC(aoUnixTime).Format(`"2006-01-02"`) 
    fmt.Printf("%s\n", aoName) 
    regexp_pattern := "/" + aoName + "/" 
    regex, _ := regexp.Compile(regexp_pattern); 

    cleaned_json := regex.ReplaceAllString(string(body2), "ntrends") 
    os.Stdout.WriteString(cleaned_json) 

不顯示任何更改。我指定的正則表達式錯了嗎?看起來像'Go'一次只允許一個正則表達式...

更新: 現在可以將日期/時間更改爲「ntrends」,但「解組」不起作用。我能得到的一切使用json.Decode移動到界面,但是通過它不能重複......

我想我的新問題是,如何遍歷:使用

map[as_of:1.268176902e+09 trends:map[ntrends:[map[name:#nowplaying query:#nowplaying] map[name:#imtiredofseeing query:#imtiredofseeing] map[name:#iWillNever query:#iWillNever] map[name:#inmyfamily query:#inmyfamily] map[name:#raiseyourhandif query:#raiseyourhandif] map[name:#ripbig query:#ripbig] map[name:QVC query:QVC] map[name:#nooffense query:#nooffense] map[name:#RIPLaylaGrace query:#RIPLaylaGrace] map[name:Justin Bieber query:"Justin Bieber"]]]] 

「爲...範圍「給我奇怪的東西...

回答

2

Twitter是著名的Fail WhaleTwitter API得到了不及格太多;這太糟糕了。

trends current Search API method響應可表示(僅使用兩個趨勢,以簡化的實施例)在規範的,歸一化的JSON格式爲:

{ 
    "as_of":1268069036, 
    "trends":[ 
     {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""}, 
     {"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"} 
    ] 
} 

as_of日期是在Unix時間,因爲1的秒數/一千九百七十〇分之一。

在Go中,這可以通過進行說明:

type Trend struct { 
    Name string 
    Query string 
} 

type Current struct { 
    As_of int64 
    Trends []Trend 
} 

Twitter的軋液機的規範,標準化的JSON格式成爲:

{ 
    "as_of":1268069036, 
    "trends":{ 
     "2010-03-08 17:23:56":[ 
      {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""}, 
      {"name":"#MusicMonday","query":"#MusicMonday"} 
     ] 
    } 
} 

有時,微博返回該等效JSON形式。

{ 
    "trends":{ 
     "2010-03-08 17:23:56":[ 
      {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""}, 
      {"name":"#MusicMonday","query":"#MusicMonday"} 
     ] 
    }, 
    "as_of":1268069036 
} 

"2010-03-08 17:23:56":是一個JSON對象名稱。但是,它是 - 無意義的 - 一個字符串形式as_of

如果我們通過對象名稱"ntrends":(嵌套趨勢)取代"2010-03-08 17:23:56":,覆蓋冗餘as_of字符串的時候,我們有以下修訂Twitter的JSON形式:

{ 
    "as_of":1268069036, 
    "trends":{ 
     "ntrends":[ 
      {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""}, 
      {"name":"#MusicMonday","query":"#MusicMonday"} 
     ] 
    } 
} 

可以很容易地掃描Twitter的JSON形式爲"as_of":,閱讀下面的號碼作爲as_of Unix時間,並將其轉換成JSON名形式,例如:

var aoUnixTime int64 
// insert code to find and convert as_of Unix time to aoUnixTime 
aoName := time.SecondsToUTC(aoUnix).Format(`"2006-01-02 15:04:05":`) 

現在我們可以掃描Twitter的JSON格式爲aoName值,並將其替換爲"ntrends":以獲取修訂後的Twitter JSON表單。

type Trend struct { 
    Name string 
    Query string 
} 

type NTrends struct { 
    NTrends []Trend 
} 

type Current struct { 
    As_of int64 
    Trends NTrends 
} 

注::

在Go中,修改後的微博JSON形式可以通過將所描述的結構和字段標識符的第一個字符是大寫,使得它們可以被導出。

我已經編程和測試了這種方法,它似乎工作。由於這是你的一個學校項目,我還沒有發佈我的代碼。

+0

謝謝彼得。 FWIW我沒有對任何代碼進行評分,實際上我沒有編寫任何代碼,只是試圖展示該語言的功能。這是一個我真正喜歡的「編程語言理論」課程。我們現在覆蓋軌道... – danwoods 2010-03-09 18:45:58

+0

請參閱已編輯的OP ... – danwoods 2010-03-09 21:50:04

1

呃,這看起來像Go不能解析的JSON。 Twitter在他們的API中一直吸引着這種奇怪的東西。

'趨勢'對象是從日期對象到趨勢主題數組的映射。不幸的是,Go JSON解析器不夠聰明來處理這個問題。

與此同時,您可以手動解析此格式,或者只是對主題執行正則表達式搜索。

無論哪種方式,我會發布這是一個圍棋的問題,看看他們在說什麼: http://code.google.com/p/go/issues/list

+0

還沒有想過用手解析它,這就是我現在要做的......但是我的結構結構看起來正確嗎? – danwoods 2010-03-09 00:50:56

+0

我不確定解析它會出現什麼問題。日期序列化爲一個字符串,這不應該導致任何問題。它只是映射到一個字符串而不是日期對象。 – 2010-03-09 03:50:31

+0

但是不要名稱(json中冒號左邊的變量)在我沒有封送的結構中必須有匹配的變量名?即:如果「\」2010-03-08 17:23:56「\」是一個'名稱',我如何創建一個變量來保存它? – danwoods 2010-03-09 07:41:44

1

修改爲較早的答案。

Twitter的搜索API方法的趨勢反應是方便的規範和標準化JSON形式:

{"trends":[{"name":"#amazonfail","url":"http:\/\/search.twitter.com\/search?q=%23amazonfail"},... truncated ...],"as_of":"Mon, 13 Apr 2009 20:48:29 +0000"} 

Twitter的搜索API方法的發展趨勢當前,每日但是每週的反應是,在不必要的不​​便JSON形式相似到:

{"trends":{"2009-03-19 21:00":[{"query":"AIG","name":"AIG"},... truncated ...],... truncated ...},"as_of":1239656409} 

在明顯地違反了對算法和數據結構的封裝的規則,這不必要地公開了目前這些方法都使用地圖或字典其實施。

要使用json包將Twitter current trends中的JSON數據讀入Go數據結構,我們可以執行類似於以下內容的操作。

package main 

import (
    "fmt" 
    "json" 
) 

type Trend struct { 
    Name string 
    Query string 
} 

type Current struct { 
    As_of int64 
    Trends map[string][]Trend 
} 

var currentTrends = `{"as_of":1268069036,"trends":{"2010-03-08 17:23:56":[{"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},{"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"},{"name":"Oscars","query":"Oscars OR #oscars"},{"name":"#nooffense","query":"#nooffense"},{"name":"Hurt Locker","query":"\"Hurt Locker\""},{"name":"Justin Bieber","query":"\"Justin Bieber\""},{"name":"Cmon","query":"Cmon"},{"name":"My World 2","query":"\"My World 2\""},{"name":"Sandra Bullock","query":"\"Sandra Bullock\""}]}}` 

func main() { 
    var ctJson = currentTrends 
    var ctVal = Current{} 
    ok, errtok := json.Unmarshal(ctJson, &ctVal) 
    if !ok { 
     fmt.Println("Unmarshal errtok: ", errtok) 
    } 
    fmt.Println(ctVal) 
}