No se puede obtener json en el formato correcto con file_get_contents()

Analizo un parámetro en un archivo php e intento obtener json con file_get_contents(). Este es mi código:

< ?php
    $url = $_GET['url'];
    $url = urldecode($url);
    $json = file_get_contents($url, true);
    echo($json);
? >

Esta es la URL llamada: http://vimeo.com/api/v2/channel/photographyschool/videos.json

Esta es una parte de mi resultado:

[{"id":40573637,"title":"All For Nothing - \"Dead To Me\" & \"Twisted Tongues\""}]

Y así sucesivamente... Entonces todo se escapa. Incluso hay \n en el resultado.

Como necesito trabajar después con json (en js), ¡necesito una versión sin escape!

Lo interesante es que mi código funciona, por ejemplo, con este json: http://xkcd.com/847/info.0.json

Cual es mi problema

preguntado el 03 de mayo de 12 a las 20:05

No todo se escapa, las comillas internas a las cadenas entrecomilladas aquí se escapan correctamente. -

json_decode() decodifica correctamente ese archivo JSON para mí, sin problemas. -

Pero, ¿cómo obtengo el eco json para poder leer el resultado del php como json? -

4 Respuestas

Si solo desea enviar por proxy/reenviar la respuesta, simplemente repítala tal como está con el encabezado de tipo de contenido correcto:

<?php
    header('Content-Type: application/json');
    $json = file_get_contents('http://vimeo.com/api/v2/channel/photographyschool/videos.json');
    echo $json;
?>

¡Tienes que tener mucho cuidado con la URL pasada ya que podría causar XSS!

Y como la API es lenta/hace falta recursos, debe almacenar en caché el resultado o al menos guardarlo en una sesión para que no se repita en cada carga de página.

<?php
$cache = './vimeoCache.json';
$url = 'http://vimeo.com/api/v2/channel/photographyschool/videos.json';

//Set the correct header
header('Content-Type: application/json');

// If a cache file exists, and it is newer than 1 hour, use it
if(file_exists($cache) && filemtime($cache) > time() - 60*60){
    echo file_get_contents($cache);
}else{
    //Grab content and overwrite cache file
    $jsonData = file_get_contents($url);
    file_put_contents($cache,$jsonData);
    echo $jsonData;
}
?>

contestado el 03 de mayo de 12 a las 21:05

¿No hay forma de "hacer eco" del json en el formato json correcto para que mi php solo imprima lo que vimeo json está entregando? - Felipe Siegfried

¿Quieres decir así? $json = file_get_contents(...); echo $json; - apodo

Utilizar esta:

echo json_decode($json);

EDIT: OLVIDE lo anterior. Intenta agregar:

header('Content-Type: text/plain');

arriba

$url = $_GET['url'];

y ver si eso ayuda.

contestado el 03 de mayo de 12 a las 21:05

@PhilippSiegfried sí, json_decode convertirá el JSON en una matriz de PHP. ¿Cómo estás analizando el JSON en tu JS? - Honyovk

¡Me gustaría tener el php como una especie de proxy para evitar problemas de secuencias de comandos entre sitios cuando hago una llamada ajax desde una máquina diferente! - Felipe Siegfried

Utiliza print_r() en cambio, tal vez? - pateman

luego obtengo Array ([0] => stdClass Object ([id] => 40573637 [title] => All For Nothing - "Dead To Me" & "Twisted Tongues"... que tampoco es un json válido... - Felipe Siegfried

@PhilippSiegfried Intenta agregar header('Content-Type: text/plain'); arriba $url = $_GET['url']; y si eso ayuda - Honyovk

contestado el 03 de mayo de 12 a las 20:05

mejor aún, donde entregas tu uso de json:

json_encode(array(
    "id" => 40573637,
    "title" => 'All For Nothing - "Dead To Me" & "Twisted Tongues"'
));

contestado el 03 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.