我想我已经找到了错误所在:
$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函数似乎在某个地方出错了。有什么帮助吗?
这不是对这个问题的直接回应,而是我花了几个小时试图解决的问题。
如果您试图通过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));
我希望我能为某人节省一些时间,我花了几个小时的追踪才弄清楚发生了什么。
谷歌给你的响应不是有效的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
去掉小数点、逗号和数字以外的所有内容,然后给我一个结果。
事实上,您对正则表达式的做法恰恰相反。在[
:[^
之后添加一个^
以否定其
$currencyValue = preg_replace('/([^0-9'.,]+)/', '', $currencyValue);
要使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对象中!
扩展Matthews的答案:
如果出于某种原因,您需要所有数据;(可能不是,但只是以防万一?)
$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'});
我在计算之前偶然发现了这个页面,所以也许其他人也会这样做:)