Domanda

Sto lavorando con API di Twitter, cercando di ottenere i dati JSON da

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

che si presenta come:

{"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\""}]}}

I miei struct assomigliano:

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  
}

e poi analizzare il JSON in una variabile di tipo Trending. Sono molto nuovo a JSON quindi la mia preoccupazione principale è fare sicuro che ho avere la struttura di dati impostato correttamente per contenere i dati JSON restituiti.

Sto scrivendo questo in 'Go' per un progetto per la scuola. (Questo non è parte di un particolare compito, proprio una cosa che sto demo-zione per una presentazione sul linguaggio)

UPDATE: In accordo con il commento di PeterSO sto andando il percorso regexp. Usando:

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)

Non mostra alcuna modifica. Sto specificando il torto regexp? Sembra che 'Go' consente solo per un'espressione regolare alla volta ...

UPDATE: può ora modificare la data / ora per "ntrends", ma il "unmarshal" non sta funzionando. Posso ottenere tutto spostato in un'interfaccia con json.Decode, ma non riesco a scorrere attraverso di essa ...

Credo che la mia nuova domanda è: Come faccio a scorrere:

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"]]]]

utilizzando "per ... gamma" mi sta dando roba strana ...

È stato utile?

Soluzione

Twitter è famosa per la sua Fail Whale , ed il Twitter API ottiene un grado di aver fallito troppo; è orribile.

tendenze metodo Search API corrente risposta possibile espressi (utilizzando solo due tendenze di semplificare gli esempi) in canonica, forma JSON normalizzata come:

{
    "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"}
    ]
}

La data as_of è nel tempo di Unix, il numero di secondi dal 1/1/1970.

In Vai, questo può essere descritto da:

type Trend struct {
    Name  string
    Query string
}

type Current struct {
    As_of  int64
    Trends []Trend
}

Twitter storpia la forma JSON normalizzata canonica di diventare:

{
    "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"}
        ]
    }
}

A volte, Twitter restituisce questo modulo JSON equivalente.

{
    "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": è un nome di oggetto JSON. Tuttavia, è - senza senso -. Una forma di stringa di as_of

Se sostituiamo "2010-03-08 17:23:56": dal nome dell'oggetto "ntrends": (per le tendenze nidificate), sovrascrivendo il tempo stringa di as_of ridondante, abbiamo la seguente rivisto modulo 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"}
        ]
    }
}

E 'facile eseguire la scansione del modulo Twitter JSON per "as_of":, leggere il seguente numero di come il tempo di Unix as_of, e convertirlo in JSON forma nome per esempio:.

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":`)

Ora possiamo eseguire la scansione del modulo Twitter JSON per il valore aoName e sostituirlo con "ntrends": per ottenere la forma Twitter JSON rivisto.

In Vai, il modulo di Twitter JSON rivista può essere descritto da:

type Trend struct {
    Name  string
    Query string
}

type NTrends struct {
    NTrends []Trend
}

type Current struct {
    As_of  int64
    Trends NTrends
}

. Nota: il primo carattere degli identificatori struct e di campo sono maiuscoli in modo che possano essere esportati

Ho programmato e testato questo approccio e sembra funzionare. Poiché si tratta di un progetto scolastico per te, non ho pubblicato il mio codice.

Altri suggerimenti

Ugh, questo sembra come JSON che Go non può analizzare. Twitter tira questo genere di roba strana per tutto il tempo nella loro API.

Gli oggetti 'tendenze' è una mappa da oggetti data a una serie di temi di tendenza. Purtroppo il parser JSON Go non è abbastanza intelligente per gestire questa situazione.

Nel frattempo si potrebbe analizzare manualmente questo formato, o semplicemente fare una ricerca espressione regolare per gli argomenti.

In ogni caso, io avrei posto questo come un problema di andare a vedere che cosa dicono: http://code.google.com/p/go/issues/list

Revisione al precedente risposta.

Il trend di risposta Twitter Search API Metodo è in comoda forma JSON canonica e normalizzato:

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

Il Twitter metodi di ricerca API tendenze attuali, tutti i giorni e le risposte settimanali sono, tuttavia, in un JSON inutilmente scomodo forma simile a:

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

In chiara violazione delle regole per l'incapsulamento di algoritmi e strutture dati, questo divulga inutilmente che attualmente questi metodi utilizzano una mappa o un dizionario per la loro attuazione.

Per leggere i dati JSON da Twitter tendenze attuali in strutture di dati Go, utilizzando il pacchetto di jSON, siamo in grado di fare qualcosa di simile a quanto segue.

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)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top