PHP json_encode没有返回有效的json

时间:2011-06-29 10:45:15

标签: php json

我正在使用PHP v5.2.17运行Debian框。我试图解决XML文件的跨域问题,并使用它来获取任何xml并返回json:

<?php
header('content-type: application/json; charset=utf-8');

if( strlen($_GET["feed"]) >= 13 ) {
  $xml = file_get_contents(urldecode($_GET["feed"]));
  if($xml) {
    $data = @simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($data);

    echo isset($_GET["callback"]) ? "{$_GET[’callback’]}($json)" : $json;
  }
}
?>

问题是,它没有将有效的json返回到jquery ..起始字符是“(”,结尾是“)”,其中jquery想要“[”作为开头,“]”作为结束。我已经获取了输出并使用了几个在线验证工具来检查它..

有没有办法可以在发回或传递json_encode选项之前更改这些字符?

4 个答案:

答案 0 :(得分:1)

你可以将json_encode($ data)更改为json_encode(array($ data)),如果它需要一个数组(就像你说的那样):

$json = json_encode(array($data));

编辑:另外,我相信SimpleXml调用会产生一堆SimpleXmlElements,或许json_encode认为它应该是对象,而不是数组?也许转换为数组会产生正确的结果。

答案 1 :(得分:1)

你不能json_encode() SimpleXMLElement(这是simplexml_load_string()返回的类型。你必须将XML文件中的数据转换为某种本机PHP类型(大多数)可能是一个数组)。

抱歉这是错的。 json_encode()实际上可以编码SimpleXMLElement(至少在我的PHP版本5.3.4上)。因此,如果您的客户端代码需要一个数组,则必须将$data包装在一个数组中:

$json = json_encode(array($data));

答案 2 :(得分:0)

我们最有可能在数组上使用json_encode()函数。所以你先把XML内容放到PHP数组中然后应用json_encode()。我认为这样可以解决你的问题。

答案 3 :(得分:0)

您似乎正在发送一个空的回调参数或其他内容,但jQuery中的回调参数必须与此完全相同:callback=?