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数据.
我正在’Go’中写这个用于学校的项目. (这不是特定任务的一部分,只是我正在演示的语言演示)
更新:根据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”,但“Unmarshaling”不起作用.我可以使用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"]]]]
使用“for … range”给了我奇怪的东西……
可以使用规范的,规范化的JSON格式表达Twitter trends current Search API method响应(仅使用两个趋势来简化示例):
{ "as_of":1268069036,"trends":[ {"name":"Happy Women's Day","query":"#MM"} ] }
as_of日期是Unix时间,即自1970年1月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":"#MusicMonday"} ] } }
有时,Twitter会返回此等效的JSON表单.
{ "trends":{ "2010-03-08 17:23:56":[ {"name":"Happy Women's Day","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":"#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表单.
在Go中,修订后的Twitter JSON表单可以通过以下方式描述:
type Trend struct { Name string Query string } type NTrends struct { NTrends []Trend } type Current struct { As_of int64 Trends NTrends }
注意:struct和field标识符的第一个字符是大写的,以便可以导出它们.