основной json> вопрос о структуре (использование 'Идут'),

Я работаю с 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"]]]]

использование "для... диапазона" дает мне странный материал...

5
задан danwoods 9 March 2010 в 23:28
поделиться

3 ответа

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
}

Примечание: первый символ идентификаторов структуры и поля - заглавные, поэтому их можно экспортировать.

Я запрограммировал и протестировал этот подход, и, похоже, он работает. Поскольку это школьный проект, я не публиковал свой код.

2
ответ дан 15 December 2019 в 00:58
поделиться

Уф, похоже, это JSON, который Go не может разобрать. Twitter постоянно использует такие странные вещи в своем API.

Объект 'trends' - это карта из объектов даты в массив трендовых тем. К сожалению, парсер Go JSON недостаточно умен, чтобы справиться с этим.

Тем временем вы можете вручную разобрать этот формат или просто выполнить поиск тем по регулярному выражению.

В любом случае, я бы опубликовал это как проблему Go и посмотрел, что они ответят: http://code.google.com/p/go/issues/list

1
ответ дан 15 December 2019 в 00:58
поделиться

Исправление к предыдущему ответу.

Ответ тенденций метода 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)
}
1
ответ дан 15 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: