📜  不带引号的 php json_decode - PHP (1)

📅  最后修改于: 2023-12-03 15:35:54.914000             🧑  作者: Mango

不带引号的 PHP json_decode

简介

在PHP中,我们通常可以使用json_decode函数将一个json格式的字符串转换为一个PHP对象或者数组。但是当我们得到的json字符串中的属性名没有带引号时,如果直接使用json_decode函数,就会出现语法错误。这时就需要特殊处理。

问题描述

当我们得到的json字符串中,属性名没有带引号时,使用json_decode函数会出现如下错误:

Syntax error, malformed JSON

例如下面的json字符串:

{a: 1, b: "hello"}
解决方案

要解决这个问题,我们需要使用正则表达式将json字符串中的属性名用引号括起来。具体代码如下:

function json_decode_without_quotes($str) {
    $pattern = '/([{\[,]\s*)([a-zA-Z0-9_]+?)\s*:/';
    $str = preg_replace($pattern, '"$2":', $str);
    return json_decode($str, true);
}

这个函数会先用正则表达式将json字符串中的属性名加上引号,然后调用json_decode函数将其转换为一个PHP数组。注意要设置第二个参数为true,这样json_decode函数返回的就是一个数组而不是一个对象。

使用示例
$data = '{a: 1, b: "hello"}';
$result = json_decode_without_quotes($data);
print_r($result);

输出结果为:

Array (
    [a] => 1
    [b] => hello
)
总结

使用不带引号的属性名是不符合标准的json格式的,但有些时候我们可能仍会遇到这样的字符串。在这种情况下,可以使用正则表达式将属性名加上引号,然后再调用json_decode函数来解析字符串。