2011-01-18 14 views
5

He estado usando la API de Google Finance para recopilar información de stock. El problema es que después de una llamada al http://www.google.com/finance/info?infotype=infoquoteall&q=[$tickerSymbol], el JSON que Google devuelve tiene // agregado antes y por lo tanto la cadena no se puede codificar utilizando el json_encode() de PHP. El JSONLint JSON Validator confirma que los // s no son válidos. La solución obvia es quitar las barras desde el comienzo del JSON. No obstante, me pregunto por qué Google está agregando barras al JSON que está devolviendo. ¿Hay algún propósito detrás de las barras adicionales? ¿Es esto una peculiaridad con PHP json_encode() cuando otros idiomas simplemente ignorarían los caracteres extra? ¿Estoy haciendo algo incorrectamente?Barras iniciales en JSON de la llamada de la API de Google Finance

Aquí hay un ejemplo del resultado de una solicitud de http://www.google.com/finance/info?infotype=infoquoteall&q=AAPL con las barras diagonales iniciales.

// [ { 
"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

Me encontré con esto también, alguna vez averiguar qué pasa con esto? Lo único que noté es que parece anteponer las barras cuando le da una empresa real (en lugar de un montón de resultados de búsqueda si no podía encontrar la empresa en particular). Muy extraño. –

+0

+1. Experimentando lo mismo, y no puedo entender por qué anexan caracteres inválidos a la respuesta. Supongo que tiene algo que ver con la seguridad, pero no puedo encontrar ninguna documentación sobre esto. – dbau

Respuesta

5

Para aquellos que buscan una respuesta lista, este es un ejemplo de trabajo con PHP; El JSON se limpia y se transforma en un objeto. Los valores se pueden extraer fácilmente.

El segundo es simplemente para hacerlo más increíble, envía un mensaje de inserción a un canal de PubNub cuando se accede a la página (cron es su amigo). PubNub mensaje fácilmente se puede recibir a través de JavaScript, por lo tanto vivir ...

<?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 
?> 

por supuesto, si se necesita algo vivo actualizando todo el tiempo que hay mejores opciones. Solo buscaba actualizar cada 30min/60min.

2

Supongo que es porque Google no quiere que trabajes con ese JSON, recomiendan utilizar la API de datos de Google.

+1

¿Alguna razón para esa teoría? Parece que simplemente bloquearían el JSON si no quieren que uno trabaje con él. –

+1

Por supuesto: no encuentro ninguna documentación sobre el uso de JSON. Pero puedo ver, por ejemplo, en JS-API-docs lo siguiente * La representación subyacente de los datos es JSON, pero la biblioteca del cliente proporciona una capa de abstracción por lo que no tiene que trabajar directamente con los datos JSON. * –

Cuestiones relacionadas