我的JSON存在问题。它在PHP 5.3中正确返回(所以我不能使用json_last_error()),当我将字符串显式复制到json_decode(json_decode('{...}')时它会成功返回。它只在我通过时返回null作为变量的结果,我使用的是PHP 5.2,这就是我所需要的。
输出来自PHPUnit中的JSON日志记录:
[
{
"event": "suiteStart",
"suite": "",
"tests": 2
},
{
"event": "suiteStart",
"suite": "TagTestCase",
"tests": 2
},
{
"event": "test",
"suite": "TagTestCase",
"test": "TagTestCase::test_it",
"status": "fail",
"time": 0.00248718261719,
"trace": [
{
"file": "\/UnitTest\/PHPUnit.php",
"line": 98,
"function": "run",
"class": "PHPUnit_Framework_TestSuite",
"type": "->",
"args": [
{
}
]
},
{
"file": "\/UnitTest\/PHPUnit.php",
"line": 116,
"function": "run",
"class": "PHPUnit",
"type": "->",
"args": [
]
},
{
"file": "\/UnitTest\/PHPUnit.php",
"line": 212,
"function": "__tostring",
"class": "PHPUnit",
"type": "->",
"args": [
]
}
],
"message": "false assertionzzzzz.\nFailed asserting that <boolean:false> is true."
},
{
"event": "test",
"suite": "TagTestCase",
"test": "TagTestCase::test_two",
"status": "pass",
"time": 0.00182914733887,
"trace": [
],
"message": ""
}
]
编辑:这些是路径,我一直在探索 - 也许你是一个更好的探险家..
三种可能有用的途径:
任何帮助都会受到极大的赞赏。
谢谢! 马特
答案 0 :(得分:20)
多么糟糕的调试会议......好消息......我想出来了..
我开始使用AJAX查看它并使用Firebug进行日志记录...事实证明,json_decode(或顺便说一句eval)无法处理"
,这是PHPUnit发回的内容(来吧塞巴斯蒂安!) ,所以要解决它:
$json = str_replace('"', '"', $json);
现在我以为他们是一样的......也许有人可以开导我..
答案 1 :(得分:17)
昨天我花了2个小时检查并修复了这个错误,最后我发现我想解码的JSON字符串是'\'斜杠。因此,合乎逻辑的做法是使用stripslashes函数或类似于不同PL的东西。
当然最好的方法是打印这个var并查看它在json_decode之后变成什么,如果它为null你也可以使用json_last_error()函数来确定它将返回整数但是这些是int的错误描述:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8
在我的情况下,我输出的json_last_error()数字为 4 ,因此它是 JSON_ERROR_SYNTAX 。然后我去看看我想要转换的字符串,它在最后一行:
'\'title\' error ...'
之后真的只是一个简单的修复。
$json = json_decode(stripslashes($response));
if (json_last_error() == 0) { // you've got an object in $json}
答案 2 :(得分:4)
当我使用时:
phpunit --log-json file.json <test_file>
(使用PHPUnit 3.4.13),它创建的文件似乎不包含有效的JSON,
json文件包含“json”,它看起来像:
{...}{...}{...}{...}
而不是我期望看到的:
[{...},{...},{...},{...}]
不确定您遇到的问题是否相同,问题中的示例JSON输出似乎比我看到的更有效。
添加缺少的逗号和括号后,可以在PHP 5.2.10或PHP 5.3.2上使用json_decode()进行解析。
答案 3 :(得分:2)
试试这个问题就是这个html_entity_decode($你的价值);
if(get_magic_quotes_gpc()){
$param = stripslashes($row['your column name']);
}else{
$param = $row['your column name'];
}
$param = json_decode(html_entity_decode($param),true);
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
);
echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
print_r($param);
答案 4 :(得分:1)
你应该使用这个
$jsonstring = stripslashes(str_replace('\"', '"', $jsonstring));
我用PHP 5.3进行了测试
答案 5 :(得分:0)
尝试在ALL中设置错误报告,json_decode()应该在转换失败的偏移量中给出通知。
答案 6 :(得分:0)
Sebastian关于json输出格式的有用帖子
https://github.com/sebastianbergmann/phpunit/issues/142
使用Keith的建议将允许正确解析数据
答案 7 :(得分:0)
我注意到PHP版本5.14.12的这种行为,也可能适用于其他版本
当使用file_get_contents将JSON字符串加载到json_decode函数中时,我必须去除BOM字符,即UTF-8 EF BB BF才能正常工作。
比较两个字符串的长度 - 硬编码与传入的变量 - 如果它们不相同,这些字符可能是罪魁祸首。
答案 8 :(得分:0)
您可以在提交之前设置数据库字符集 - 解决我的问题:
$sql = $mysqli->set_charset("utf8");
答案 9 :(得分:0)
自PHP 7.3 起,json_decode函数将接受新的JSON_THROW_ON_ERROR选项,该选项将使json_decode引发异常,而不是在出错时返回null。
示例:
try {
json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (\JsonException $exception) {
echo $exception->getMessage(); // displays "Syntax error"
}