猫和老鼠出现这个json decode error怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猫和老鼠出现这个json decode error怎么办?相关的知识,希望对你有一定的参考价值。

猫和老鼠出现这个“json decode error”这个是程序的问题,不是你的原因,可以把这个问题和它在什么情况下发生的,发给官方支持,让他们可以处理。 参考技术A 聊天和鼠标出现这个“JSON代码错误”是一个程序问题,不是你的原因,可以发送这个问题以及在什么情况下发生,发送官方支持让他们可以处理。

PHP:JSON 中的正则表达式导致 json_decode 出现问题? [复制]

【中文标题】PHP:JSON 中的正则表达式导致 json_decode 出现问题? [复制]【英文标题】:PHP: regex in JSON causes problem for json_decode? [duplicate] 【发布时间】:2019-06-13 06:43:47 【问题描述】:

我的 JSON 中有一些正则表达式,当我在在线 JSON 验证器上测试我的 JSON 时,这似乎不是问题。但是,当我使用该 JSON 字符串并尝试在 PHP 中使用 json_decode() 时,我得到一个 JSON_ERROR_SYNTAX

任何想法为什么?我该如何解决这个问题?

示例代码:

<?php

$json = <<<EOD

  "regex": [
    "Hello\s+World"
  ]

EOD;

json_decode($json);

switch (json_last_error()) 
    case JSON_ERROR_NONE:
        echo ' - No errors';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - Underflow or the modes mismatch';
    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_UTF8:
        echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
    break;
    default:
        echo ' - Unknown error';
    break;

问题出在\s。将其更改为 \\s 没有帮助。

【问题讨论】:

哪个在线 JSON 验证器可以验证这个问题中的那个? 看看this package。您可以使用它轻松地将数组转换为 JSON 字符串。 【参考方案1】:

当您在 PHP 中编写 "\s" 时,文字字符串为 \s,因为 \s 不是有效的转义序列。

当您在 PHP 中编写 "\\s" 时,文字字符串是 \s,因为 \\ 一个有效的转义序列。

另一方面,JSON 会为无效的转义序列抛出错误,这是您的问题。

解决办法: 不要手写JSON。

$json = json_encode(['regex'=> ['Hello\s+World']]);

输出:"regex":["Hello\\s+World"] [注意:文字字符串,有效 JSON]

糟糕的解决方案比它的价值更麻烦,并且可能会导致问题: "Hello\\\s+World" 欢迎来到地狱。

【讨论】:

当我将 json_decode 为 JSON 数组时,我希望得到一个 PHP 数组作为回报。我得到一个字符串。有什么想法吗? 您的数组可能已被编码多次。显示您的起始 JSON。【参考方案2】:

您的字符串"Hello\s+World" 必须像"Hello\\\s+World" 一样转义。第一个转义\ 用于转义第二个转义\ 转义\s

如果你想在输出中有一个数组,那么你必须将assoc = true设置为json_decode()函数的第二个参数。

documentation 中了解有关 json_decode() 函数的更多信息。

解决方案

查看我的代码中的 DEMO

<?php
$json = '"regex":["Hello\\\s+World"]';

$obj1 = json_decode($json);
echo $obj1->regex[0]."<br>";

$obj2 = json_decode($json, true); //When assoc == TRUE, returned objects will be converted into associative arrays.
echo $obj2["regex"][0];
?>

如何转义所有 JSON 控制字符:

PHP's json_encode does not escape all JSON control characters

【讨论】:

【参考方案3】:

由于潜在的复杂正则表达式和双重转义问题,您没有得到您期望的字符串文字。

这应该适用于任何正则表达式:

$regex1 = <<<EOD
Hello\s+World
EOD;

$obj = new stdClass();
$obj->regex = array();
$obj->regex[] = $regex1;

$json = json_encode($obj);

$decoded = json_decode($json);

var_dump($decoded->regex[0]);

输出

string(13) "Hello\s+World"

【讨论】:

以上是关于猫和老鼠出现这个json decode error怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 php json_decode 中的 JSON_ERROR_UTF8 错误?

解决php中json_decode的异常JSON_ERROR_CTRL_CHAR

json_decode返回null 和synax error原因及处理

json.loads 报错 json.decoder.JSONDecodeError

json.decode() 输入意外结束(在字符 1 处)

json_decode() (PHP 7) 中的新行和标签