我从python接收json数组作为PHP中curl_exec的返回(第一个json PHP - > python,返回另一个json),并且由于语法错误导致解码失败。收到的json是有效的,但不知何故,如果我将这个json转换为字符串并打印出来,我会得到一个包含29个字符的字符串,但如果我打印strlen((字符串)$ my_json)则表示50。
以下是代码:
$results = curl_exec($ch);
curl_close($ch);
var_dump(json_decode($results));
然后返回NULL。如果我做以下
echo (string)$results;
打印[[11,“stuffstuf”,“stuffs”]](29个字符),这是一个有效的json。但是如果我做的话
echo strlen((string)$results);
它打印50。
所以,我不知道发生了什么。任何想法将不胜感激=)
答案 0 :(得分:17)
可能是因为你在做简单的回声时看不到它周围的一些html标签吗?
尝试:echo htmlentities((string)$results);
查看更多信息,或查看网页的html来源。
如果json_decode()
失败,则表示该字符串不是标准JSON。
您还可以使用json_last_error_msg()找出返回NULL的原因。如果json_decode中有任何错误,那将返回错误消息。
答案 1 :(得分:1)
Seldaek的回答是一个很大的帮助,我相信这是最好的答案。
我遇到了类似的问题,这是由于使用单引号而不是双引号,以及Red Hat上最新支持的PHP版本与Ubuntu上的PHP 5.5之间的差异。
RHEL上的PHP在从文件中读取下一行时返回“无效或格式错误的JSON”,因为它在我的Ubuntu PHP 5.5实例上很好。
{ 'book': 'Dune', 'author': 'Frank Herbert', 'ISBN-13': '978-0441172719' }
更改为双引号,如下所示,解决了我的问题
{ "book": "Dune", "author": "Frank Herbert", "ISBN-13": "978-0441172719" }
答案 2 :(得分:0)
塞尔达克说得对,json_last_error
的使用非常好。我还在stripslashes
之前使用json_decode
。这是我的代码:
$resp = stripslashes($resp);
$resp_json = json_decode($resp);
switch(json_last_error())
{
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Invalid or malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
}
之后当你debug
并且你仍然让我们说错误4 - JSON_ERROR_SYNTAX。在调试模式下获取变量VALUE
的{{1}}并将其粘贴到免费的Web工具以进行JSON转换@ Json conversion check - jsonlint。并查看您的转化有什么用处。
答案 3 :(得分:0)
可以打印出json_last_error_msg(),它以文本格式而不是代码提供错误。所以不需要使用切换和错误处理。