php - 如何使用撇号而不是引号对无效的 JSON 进行 json_decode

标签 php json

示例代码:

<?php

$json = "['foo', 'bar']";

var_dump( json_decode($json) );

它适用于 PHP 5.5.3,但它不适用于较低的 PHP 版本

它在我的机器上运行 PHP 5.5.3 但在其他地方都失败了。

我知道这是不正确的 JSON,但我的网络服务给了我带有 ' 符号和 "

的 JSON
['foo', "bar", {'test': "crazy \"markup\""}]

Sandbox

如何在 PHP 5.3 中解析带撇号的 JSON 数据? 显然我要解析的原始 JSON 更复杂。

(我无法在生产服务器上升级我的 PHP,也无法从 web 服务获取正确的 JSON)

最佳答案

下面是这个问题的替代解决方案:

function fixJSON($json) {
    $regex = <<<'REGEX'
~
    "[^"\\]*(?:\\.|[^"\\]*)*"
    (*SKIP)(*F)
  | '([^'\\]*(?:\\.|[^'\\]*)*)'
~x
REGEX;

    return preg_replace_callback($regex, function($matches) {
        return '"' . preg_replace('~\\\\.(*SKIP)(*F)|"~', '\\"', $matches[1]) . '"';
    }, $json);
}

这种方法在两个方面比 h2ooooooo 的功能更强大:

  • 它通过对双引号应用额外的转义来保留出现在单引号字符串中的双引号。 h2o 的变体会将它们替换为双引号,从而改变字符串的值。
  • 它将正确处理转义双引号 \",h2o 的版本似乎进入了无限循环。

测试:

$brokenJSON = <<<'JSON'
['foo', {"bar": "hel'lo", "foo": 'ba"r ba\"z', "baz": "wor\"ld ' test"}]
JSON;

$fixedJSON = fixJSON($brokenJSON);
$decoded = json_decode($fixedJSON);

var_dump($fixedJSON);
print_r($decoded);

输出:

string(74) "["foo", {"bar": "hel'lo", "foo": "ba\"r ba\"z", "baz": "wor\"ld ' test"}]"
Array
(
    [0] => foo
    [1] => stdClass Object
        (
            [bar] => hel'lo
            [foo] => ba"r ba"z
            [baz] => wor"ld ' test
        )
)

关于php - 如何使用撇号而不是引号对无效的 JSON 进行 json_decode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348380/

相关文章:

sql - 如何解析postgres中文本列的json值

php - 无法使用 PHP 套接字发送 XML 数据

php - Laravel4 模型主键值在插入后丢失

php - AJAX:没有从数据库中获取关联数组

php - 如何使服务像 SwiftMailer 一样在 kernel.terminate 上工作?

php连接多个json文件并按id分组

php - HTML 动态裁剪

json - 如何使用 JSON 对象初始化 TypeScript 对象?

json - Avro 不处理循环引用

javascript - 如何在 JavaScript 中替换 JSON 字符串中的所有 sibling ?