php中的json_解码返回null

php中的json_解码返回null,php,json,Php,Json,我试图编码一个json字符串,但它总是返回null。我在圣彼得堡尝试了一些建议 $url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NY

我试图编码一个json字符串,但它总是返回null。我在圣彼得堡尝试了一些建议

$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";

$obj = file_get_contents($url);
$obj = json_decode($obj);
var_dump($obj);
试试这个代码

<?php
function convert($string) {
    return preg_replace_callback('#\\\\x([[:xdigit:]]{2})#ism', function($matches) {
        return htmlentities(chr(hexdec($matches[1])));
    }, $string);
}
$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";

$obj = file_get_contents($url);
$obj = convert($obj);
$obj = json_decode($obj);
echo '<pre>'; print_r($obj); echo '</pre>';
?>

正如推荐的(并且@showdev已经指出了,谢谢!)您应该使用他们的RSS API并将其解析为XML,因为Google认为没有必要遵守web标准(在这里,他们在JSON上失败;在其他地方,他们在简单的事情上失败,比如SMTP,尤其是IMAP)


JSON有一个非常详细的规范,在生成器中很容易遵循。出于安全原因,建议严格执行JSON解析,特别是对于外部输入。因此,请使用Google的RSS变体。

JSON不支持\x转义,因此根据定义,它是无效的JSON,因此JSON_decode()返回null。解码有效的JSON\u0022可以正常工作


在运行
json\u decode
之前,
$obj
包含什么?看起来如果你想编码一个字符串,你必须使用
json\u encode
而不是
json\u decode
@Verhaeren,我会假设他想要获取一个字符串(他从该URL获取)并将其解码为一个对象/数组。@AlpineCoder我指出问题标题中缺乏一致性。这可能会有所帮助:。它特别提到了谷歌/金融。“来自谷歌的JSON提要似乎总是被问题所困扰……”你有没有尝试过使用rss选项参数?我建议您在添加答案之前先这样做。解决方法确实是将
\x
符号转换为
\u00
符号<代码>修剪()不是必需的。工作起来很有魅力!@Jasper N.Brouwer是的,不需要。我之所以添加它,是因为json数据有空格。
$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";

$obj = file_get_contents($url);
$obj = trim($obj);
$obj = str_replace('\x', '\u00', $obj);
$obj = json_decode($obj,true);
var_dump($obj);