Я работаю с API Твиттера, пытаясь получить 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 я иду regexp путем. Используя:
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)
Не показывает изменений. Я указываю regexp неправильно? Это походит, 'Идут', только допускает один regexp за один раз...
ОБНОВЛЕНИЕ: может теперь изменить дату/время на "ntrends", но "Немаршалинг" не работает. Я мог переместить все в интерфейс с помощью json. Декодируйте, но не может выполнить итерации через него...
Я предполагаю, что мой новый вопрос, Как делают я выполняю итерации через:
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"]]]]
использование "для... диапазона" дает мне странный материал...
Twitter известен своим Fail Whale , и Twitter API также получает плохую оценку; это ужасно.
Twitter тенденции текущего метода Search API можно выразить (используя только две тенденции для упрощения примеров) в канонической нормализованной форме 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 - количество секунд с 01.01.1970.
В 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"}
]
}
}
Иногда Twitter возвращает эту эквивалентную форму 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
.
Если мы заменим «2010-03-08 17:23:56»:
на имя объекта «ntrends»:
(для вложенных трендов), избыточный будет перезаписан ] as_of
string time, у нас есть следующая измененная форма 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 time и преобразовать его в форму имени 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
}
Примечание: первый символ идентификаторов структуры и поля - заглавные, поэтому их можно экспортировать.
Я запрограммировал и протестировал этот подход, и, похоже, он работает. Поскольку это школьный проект, я не публиковал свой код.
Уф, похоже, это JSON, который Go не может разобрать. Twitter постоянно использует такие странные вещи в своем API.
Объект 'trends' - это карта из объектов даты в массив трендовых тем. К сожалению, парсер Go JSON недостаточно умен, чтобы справиться с этим.
Тем временем вы можете вручную разобрать этот формат или просто выполнить поиск тем по регулярному выражению.
В любом случае, я бы опубликовал это как проблему Go и посмотрел, что они ответят: http://code.google.com/p/go/issues/list
Исправление к предыдущему ответу.
Ответ тенденций метода API поиска Twitter представлен в удобной канонической и нормализованной форме JSON:
{"trends":[{"name":"#amazonfail","url":"http:\/\/search.twitter.com\/search?q=%23amazonfail"},... truncated ...],"as_of":"Mon, 13 Apr 2009 20:48:29 +0000"}
Текущие, ежедневные и еженедельные ответы методов API поиска Twitter представлены в излишне неудобной форме JSON, аналогичной:
{"trends":{"2009-03-19 21:00":[{"query":"AIG","name":"AIG"},... truncated ...],... truncated ...},"as_of":1239656409}
В явном нарушении правил инкапсуляции алгоритмов и структур данных это излишне раскрывает, что в настоящее время эти методы используют карту или словарь для своей реализации.
Чтобы прочитать данные JSON из текущих тенденций Twitter в структуры данных Go, используя пакет json, мы можем сделать что-то подобное следующему.
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)
}