php json_decode在键上没有引号就失败了

Bar*_*Bar 6 php json

我有这样的json数据

{key:"value"}
Run Code Online (Sandbox Code Playgroud)

(没有引号密钥......)

我想将它转换为关联数组.

PHP的json_decode返回null

如何在键周围添加引号?谢谢...

Int*_*ual 12

您可以在源处修复JSON以使其返回有效的JSON结构,也可以在键周围手动添加引号.

这个答案对一个类似问题有如何做到这一点的例子:

function my_json_decode($s) {
    $s = str_replace(
        array('"',  "'"),
        array('\"', '"'),
        $s
    );
    $s = preg_replace('/(\w+):/i', '"\1":', $s);
    return json_decode(sprintf('{%s}', $s));
}
Run Code Online (Sandbox Code Playgroud)

  • 不是有效的解决方案!尝试将一个键或"值"设置为URL或带冒号的内容.这将失败.例如{key:"va:lue"} (4认同)

rid*_*rid 6

如果您无法在源代码中将其转换为有效的JSON,那么您可以使用Services_JSONPEAR来解析它,因为在密钥周围添加引号是一个非常容易出错的错误过程.

Services_JSON 将正确解析无效的密钥字符串.

例:

$json = new Services_JSON();
var_dump($json->decode('{key:"value"}'));
Run Code Online (Sandbox Code Playgroud)

输出:

object(stdClass)#2 (1) {
  ["key"]=>
  string(5) "value"
}
Run Code Online (Sandbox Code Playgroud)


tri*_*cot 6

为了避免将双引号插入到不应该出现的位置,您应该在此操作中跳过那些引用的字符串.

例如,如果您在字符串中包含此JavaScript对象文字:

{
   dt:"2016-10-22T09:13:20",
   "x:y":false
}
Run Code Online (Sandbox Code Playgroud)

......然后必须注意不要22T09:改变"22T09":.此外,已引用的密钥"x:y"应保持不变.

您可以使用此正则表达式来实现:

preg_replace('/("(.*?)"|(\w+))(\s*:\s*(".*?"|.))/s', '"$2$3"$4', $text);
Run Code Online (Sandbox Code Playgroud)

其他问题

JavaScript对象文字允许数字常量使用左填充的零,001和/或使用一元+符号,这在JSON中是不允许的.要删除那些有问题的字符,您可以使用此扩展版本:

preg_replace('/("(.*?)"|(\w+))(\s*:\s*)\+?(0+(?=\d))?(".*?"|.)/s', '"$2$3"$4$6', $text);
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 0

根据文档(请参阅示例 #3 - “使用 json_decode 的常见错误”),键必须用双引号引起来。

你从哪里获取 JSON 数据?