String似乎是有效的JSON,但``json_decode()`返回NULL

时间:2011-06-13 20:49:54

标签: php json

我想我已经找到了错误所在:

    $convertJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=" . $currencyValue . $currencySelectValue . "%3D%3FUSD", true);
    var_dump($convertJSON);
    $convertArr = json_decode($convertJSON, true);
    var_dump($convertArr);

我这样做是为了调试,我得到了这个结果(我输入了555和欧元):

string(68) "{lhs: "555 Euros",rhs: "796.64700 U.S. dollars",error: "",icc: true}"
NULL

所以似乎解码JSON对象的PHP函数在某处做错了。有什么帮助吗?

5 个答案:

答案 0 :(得分:30)

不是对这个问题的直接回应,而是我花了几个小时试图解决的问题。

如果您尝试通过CURL解码来自远程文件的JSON,并且该文件是UTF-8格式,则文件的开头可能包含以下字符(中断json_decode():



你不会用肉眼看到,只能通过htmlentities();我不知道为什么他们在那里,我一直追溯到curl_exec(),想到也许他们被添加到那里。在任何情况下,只有当文件是UTF-8格式时才会添加那些小混蛋。

因此,假设您无法控制源文件的编码,您可以在将字符串传递给json_decode()之前执行类似的操作:

$encoding = mb_detect_encoding($json);

if($encoding == 'UTF-8') {
  $json = preg_replace('/[^(\x20-\x7F)]*/','', $json);    
}    

print_r(json_decode($json));

我希望我能节省一些时间,我花了几个小时的时间来查明发生了什么。

答案 1 :(得分:3)

Google给你的回复是无效的JSON,因为没有引用标签。你必须自己解析它。

$response = '{lhs: "555 Euros",rhs: "796.64700 U.S. dollars",error: "",icc: true';
preg_match('/rhs:\s*"([^"]+)"/', $response, $m);
echo $m[1];

输出:

796.64700 U.S. dollars

答案 2 :(得分:1)

  

删除除小数点,逗号和数字之外的所有内容,然后给我一个结果。

实际上你与你的正则表达式完全相反。在^之后添加[[^以取消它

$currencyValue = preg_replace('/([^0-9\.,]+)/', '', $currencyValue);

答案 3 :(得分:1)

要使json_encode可行,您必须在结果字符串中添加双引号才能使其成为JSON格式。

我尝试下面的简单代码,它工作正常:

$data = '{lhs: "1 U.S. dollar",rhs: "7.80177256 Hong Kong dollars",error: "",icc: true}';
$data = str_replace('lhs','"lhs"',$data);
$data = str_replace('rhs','"rhs"',$data);
$data = str_replace('error','"error"',$data);
$data = str_replace('icc','"icc"',$data);
print_r(json_decode($data));

结果:

stdClass Object ( [lhs] => 1 U.S. dollar [rhs] => 7.80177256 Hong Kong dollars [error] => [icc] => 1 ) 

现在它在json_decode对象中!

答案 4 :(得分:0)

扩展马修斯答案:

如果由于某种原因你需要所有数据; (可能不是,但以防万一?)

$c='{lhs: "1 British pound",rhs: "1.5358 U.S. dollars",error: "",icc: true}';
$j=json_decode(preg_replace('/({|,)([a-z]+): /','$1"$2": ',$c));
var_dump($j->{'rhs'});

在我解决之前我偶然发现了这个页面,所以也许其他人也会这样做:)