0

我将参数解析为 php 文件并尝试使用 file_get_contents() 获取 json。这是我的代码:

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

这是被调用的 URL:http: //vimeo.com/api/v2/channel/photographyschool/videos.json

这是我的结果的一部分:

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

等等......所以一切都逃脱了。结果中甚至还有 \n 。

由于之后我需要使用 json(在 js 中),我需要一个非转义版本!

有趣的是,我的代码例如适用于这个 json:http: //xkcd.com/847/info.0.json

我的问题是什么?

4

4 回答 4

1

用这个:

echo json_decode($json);

编辑:忘记上面的。尝试添加:

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

以上

$url = $_GET['url'];

看看是否有帮助。

于 2012-05-03T19:43:53.527 回答
1

如果您只想代理/转发响应,则只需使用正确的 Content-Type 标头回显它:

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

你必须非常小心传递的 url,因为它可能导致 XSS!

由于 API 很慢/资源匮乏,您应该缓存结果或至少将其保存在会话中,这样它就不会在每次页面加载时重复。

<?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;
}
?>
于 2012-05-03T19:53:07.593 回答
0

你应该使用 json_decode : http ://php.net/manual/en/function.json-decode.php

于 2012-05-03T19:45:37.233 回答
0

更好的是,您在哪里交付您的 json 使用:

json_encode(array(
    "id" => 40573637,
    "title" => 'All For Nothing - "Dead To Me" & "Twisted Tongues"'
));
于 2012-05-03T19:46:11.607 回答