json_decode PHP的问题

时间:2011-06-12 21:00:53

标签: php json

我从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。

所以,我不知道发生了什么。任何想法将不胜感激=)

4 个答案:

答案 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(),它以文本格式而不是代码提供错误。所以不需要使用切换和错误处理。