2011-01-18 19 views
5

Ho utilizzato l'API di Google Finance per raccogliere con successo alcune informazioni di borsa. Il problema è che dopo una chiamata a http://www.google.com/finance/info?infotype=infoquoteall&q=[$tickerSymbol], il JSON restituito da Google ha aggiunto // prima di esso e quindi la stringa non può essere codificata utilizzando PHP json_encode(). Il JSONLint JSON Validator conferma che i // s non sono validi. L'ovvia soluzione è rimuovere le barre dall'inizio del JSON. In ogni caso, mi chiedo perché Google stia aggiungendo barre al JSON che sta restituendo. C'è uno scopo dietro le barre extra? Si tratta di una stranezza con PHP json_encode() quando altre lingue ignorerebbero semplicemente i caratteri extra? Sto facendo qualcosa in modo errato?Leading slash in JSON dall'API di Google Finance chiamata

Ecco un esempio del risultato di una richiesta di http://www.google.com/finance/info?infotype=infoquoteall&q=AAPL con le barre iniziali.

// [ { 
"id": "22144" 
,"t" : "AAPL" 
,"e" : "NASDAQ" 
,"l" : "340.65" 
,"l_cur" : "340.65" 
,"ltt":"4:00PM EST" 
,"lt" : "Jan 18, 4:00PM EST" 
,"c" : "-7.83" 
,"cp" : "-2.25" 
,"ccol" : "chr" 
,"el": "345.20" 
,"el_cur": "345.20" 
,"elt" : "Jan 18, 5:45PM EST" 
,"ec" : "+4.55" 
,"ecp" : "1.34" 
,"eccol" : "chg" 
,"div" : "" 
,"yld" : "" 
,"eo" : "" 
,"delay": "" 
,"op" : "327.05" 
,"hi" : "344.76" 
,"lo" : "326.00" 
,"vo" : "66.34M" 
,"avvo" : "11.28M" 
,"hi52" : "348.48" 
,"lo52" : "190.25" 
,"mc" : "313.75B" 
,"pe" : "22.49" 
,"fwpe" : "" 
,"beta" : "1.38" 
,"eps" : "15.15" 
,"name" : "Apple Inc." 
,"type" : "Company" 
} 
] 
+0

Mi sono imbattuto anche in questo, ho mai capito cosa succede? L'unica cosa che ho notato è che sembra anteporre le barre quando ti dà una compagnia reale (al contrario di un gruppo di risultati di ricerca se non riusciva a trovare la compagnia in questione). Molto strano. –

+0

+1. Sperimentare la stessa cosa, e non posso per la vita di me capire perché aggiungono caratteri non validi alla risposta. Immagino che abbia qualcosa a che fare con la sicurezza, ma non riesce a trovare alcuna documentazione su questo. – dbau

risposta

5

Per coloro che cercano una risposta pronta, ecco un esempio funzionante con PHP; Il JSON viene pulito e trasformato in un oggetto. I valori possono essere facilmente estratti.

Il secondo è solo per renderlo più impressionante, invia un messaggio push a un canale PubNub quando si accede alla pagina (cron è tuo amico). PubNub messaggio può facilmente essere ricevuto tramite JavaScript quindi vivere ...

<?php 

    //Obtain Quote Info 
    $quote = file_get_contents('http://finance.google.com/finance/info?client=ig&q=INDEXDB:DAX'); 

    //Remove CR's from ouput - make it one line 
    $json = str_replace("\n", "", $quote); 

    //Remove //, [ and ] to build qualified string 
    $data = substr($json, 4, strlen($json) -5); 

    //decode JSON data 
    $json_output = json_decode(utf8_decode($data)); 

    // get the last price 
    $last = $json_output->l; 

    //Output Stock price . 
    echo 'DAX: ' . $last; 


////////////////////////////// 
// send it through pubnub // 
////////////////////////////// 

require_once('Pubnub.php'); 

// Publish and Subscribe Keys 
$publish_key = 'demo'; 
$subscribe_key = 'demo'; 
$subscribe_key = false; 

// Create Pubnub Object 
$pubnub = new Pubnub($publish_key, $subscribe_key, $secret_key); 

// Publish ! 
$channel = 'quoteTheDax'; 

$timestamp = $pubnub->time(); 
$pubish_success = $pubnub->publish(array(
    'channel' => $channel, 
    'message' => array("last" => $last2, "ts" => $timestamp) 
)); 

//Boom its send to ppl subscribed to this channel arround the world 
?> 

, naturalmente, se avete bisogno di qualcosa di vivo aggiornando tutto il tempo ci sono opzioni migliori. Stavo solo cercando di aggiornare ogni 30 minuti/60 minuti.

2

Credo che sia perché Google non vogliono di lavorare con quella JSON, si consiglia di utilizzare l'API Google Data.

+1

Qualche ragione per quella teoria? Sembra che blocchino il JSON solo se non volessero che uno lavorasse con esso. –

+1

Ovviamente: non riesco a trovare alcuna documentazione sull'utilizzo del JSON. Ma posso vedere ad esempio sui documenti JS-API quanto segue * La rappresentazione sottostante dei dati è JSON, ma la libreria client fornisce un livello di astrazione in modo da non dover lavorare direttamente con i dati JSON. * –