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

时间:2011-08-04 12:44:23

标签: php json

我有像这样的json数据

{key:"value"}

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

我想把它翻译成一个关联数组。

PHP的 json_decode 返回null

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

8 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

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

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

示例:

$json = new Services_JSON();
var_dump($json->decode('{key:"value"}'));

输出:

object(stdClass)#2 (1) {
  ["key"]=>
  string(5) "value"
}

答案 2 :(得分:6)

为避免在不应该出现的地方插入双引号,您应该在此操作中跳过这些引用的字符串。

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

{
   dt:"2016-10-22T09:13:20",
   "x:y":false
}

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

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

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

其他问题

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

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

答案 3 :(得分:1)

请勿使用正则表达式。

在这种情况下,完全不建议使用REGEX,请勿将其用于解析此类数据。如果您有一个简单的目标并希望避免使用稳定的PEAR package,则可以尝试使用JSON-php库(但不再保留)。

1)从here获取JSON.phps文件,并将其重命名为.php,并将构造函数名称替换为__construct

2)用法:

$content = '{myKey:"valueeeee"}';

include(__DIR__.'/JSON.php'); 
$this->json = new Services_JSON( SERVICES_JSON_LOOSE_TYPE );  // to return objects instead of Associative array, remove the argument
var_dump( $this->json->decode($content)  );

答案 4 :(得分:1)

$results = \Symfony\Component\Yaml\Yaml::parse("{a: d, b: 'c', e: [a, 3]}");

您可能只能使用该库,而不必使用整个Symfony软件包:https://packagist.org/packages/symfony/yaml

答案 5 :(得分:0)

这对我有用,使用正则表达式替换' / \ s(\ w +)\ s / i'

$json =  file_get_contents("php://input"); // or whatever json data
$json = preg_replace('/\s(\w+)\s/i', '"$1"', $json);
$json = json_decode($json, true);

答案 6 :(得分:0)

请不要使用正则表达式来执行此操作!根据定义,无法以这种方式正确解析JSON语法。你将面对未来的大量错误。

我建议使用YAML解析器,因为YAML是JSON的超集并且允许同时使用不带引号的文字。

Symfony YAML component效果很好。

与本地实施的json_decode相比,会有性能损失。

答案 7 :(得分:-1)

根据documentation(参见示例#3 - '使用json_decode的常见错误'),密钥必须用双引号括起来。

你在哪里获得JSON数据?