首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何json_decode无效JSON与撇号,而不是引号?

如何json_decode无效JSON与撇号,而不是引号?
EN

Stack Overflow用户
提问于 2018-03-28 00:39:34
回答 2查看 0关注 0票数 0

示例代码:

代码语言:javascript
复制
<?php

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

var_dump( json_decode($json) );

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

我知道这是不正确的JSON,但我的web服务给我JSON与'符号一起"

代码语言:javascript
复制
['foo', "bar", {'test': "crazy \"markup\""}]

沙箱

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

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

EN

Stack Overflow用户

发布于 2018-03-28 08:47:39

这是对这个问题的另一种解决方案:

代码语言:javascript
复制
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的版本似乎进入无限循环。

测试:

代码语言:javascript
复制
$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);

输出:

代码语言:javascript
复制
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
        )
)
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档