PHP中多行JSON数据含单引号的解析问题
PHP解析含单引号的JSON失败的解决办法
原代码存在的问题
- 变量名不匹配:定义的JSON字符串变量是
$arr,但json_decode传入的是未定义的$dat,直接导致解析失败。 - JSON语法错误:
- PHP用单引号包裹JSON字符串时,
Baldwin's中的单引号会提前闭合外层单引号,破坏整个JSON结构。 - JSON对象最后一个键值对后不能加逗号(原代码中
"Spink"后的逗号属于无效语法)。
- PHP用单引号包裹JSON字符串时,
- 转义错误:原字符串中的
"是HTML实体,而非JSON要求的双引号转义符\",这会导致JSON结构识别失败。
修正后的代码示例
方法1:转义双引号,直接保留单引号
用双引号包裹JSON字符串,内部双引号转义为\",单引号可直接使用:
$arr = "{ \"38\": { \"email\": \"zhangshizhu08@163.com\", \"history\": \"Baldwin's,DNW\" }, \"39\": { \"email\": \"john@filcombe.com\", \"history\": \"Spink\" } }"; $p_array = json_decode($arr, true); // 排查解析错误 if (json_last_error() !== JSON_ERROR_NONE) { echo json_last_error_msg(); } else { print_r($p_array); }
方法2:使用HEREDOC语法(更易读)
HEREDOC无需手动转义双引号,单引号可直接写入,代码更清晰:
$arr = <<<JSON { "38": { "email": "zhangshizhu08@163.com", "history": "Baldwin's,DNW" }, "39": { "email": "john@filcombe.com", "history": "Spink" } } JSON; $p_array = json_decode($arr, true); if (json_last_error() !== JSON_ERROR_NONE) { echo json_last_error_msg(); } else { print_r($p_array); }
排查JSON解析错误的技巧
每次调用json_decode后,可通过json_last_error()和json_last_error_msg()获取具体失败原因,快速定位问题:
$p_array = json_decode($arr, true); if (json_last_error() !== JSON_ERROR_NONE) { echo "解析错误:" . json_last_error_msg(); }
内容的提问来源于stack exchange,提问作者Deepak Dubey
相关产品推荐
相关产品推荐

