如何在 PHP 中将非 json 字符串转换为有效的 json 字符串

Posted

技术标签:

【中文标题】如何在 PHP 中将非 json 字符串转换为有效的 json 字符串【英文标题】:How to convert non json string to a valid json string in PHP 【发布时间】:2015-08-10 08:07:32 【问题描述】:

我有一个基于 Web 的短信提供商的 API 服务 当我调用 api a m 得到以下响应时

Promotional SMS Credits: 0, Transactional SMS Credits: 9972

我尝试 json_decode() 将其转换为数组,但由于 JSON 格式无效(缺少键和值的引号)而失败

我想在 php 中将一个无效的 json 字符串转换为一个有效的 JSON,如下所示

"Promotional SMS Credits": "0", "Transactional SMS Credits": "9972"

谁能帮帮我?

【问题讨论】:

那么你为什么一开始就有无效的 JSON,这确实是问题所在。 【参考方案1】:

联系运行 API 提要的公司并告诉他们 JSON 错误...

您可以进行搜索和替换 (preg_replace),但困难的部分将是创建您的模糊匹配规则,因为为了解析它,您需要假设一些事情。您可能需要假设:

1a) 键不包含冒号 1b) 或关键引号被正确转义 和 2a) 值不包含逗号 2b) 或值已正确转义引号。

【讨论】:

【参考方案2】:

相当粗糙的函数,但它确实返回原始字符串的 json 格式版本。

        $str='Promotional SMS Credits: 0, Transactional SMS Credits: 9972';

        function bad_str_to_json($str)
            $str=str_replace(array('',''),'',$str);
            $pairs=explode(',',$str);
            $json=array();
            foreach($pairs as $pair)
                list($p,$v)=explode(':',$pair);
                $json[trim($p)]=trim($v);
            
            return json_encode($json);
        

        echo bad_str_to_json($str);

【讨论】:

使用 preg_replace() 函数的任何可能的解决方案?【参考方案3】:

希望这会对您有所帮助。如果您的 JSON 无效,您可以使用以下代码进行转换:

    $invalidJson = '
    Promotional SMS Credits: "0",
    Transactional SMS Credits: "9972"
';
$ValidJson = preg_replace("/\s1,/", ":", $invalidJson);

【讨论】:

不工作,我需要的格式是 "Promotional SMS Credits": "0", "Transactional SMS Credits": "9972" 真的不行,我在下面试过 $invalidJson = 'Promotional SMS Credits: 0, Transactional SMS Credits: 9972'; $ValidJson = preg_replace("/(\n[\t ]*)([^\t ]+):/", "$1\"$2\":", $invalidJson);【参考方案4】:
$str='Promotional SMS Credits: 0, Transactional SMS Credits: 9972';
$str=str_replace(array('',''),'',$str);
$tmp=explode(',',$str);
$res=array();
foreach($tmp as $t)
    $tmp2=explode(':',$t);
    $tmp2=array_combine((array)$tmp2[0],(array)$tmp2[1]);
    $res=array_merge($res,$tmp2);


echo json_encode($res,false);

【讨论】:

以上是关于如何在 PHP 中将非 json 字符串转换为有效的 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中将字符串转换为 JSON 对象

如何在PHP中将对象转换为特定格式的数组

在 Symfony 中将 JSON 转换为 Doctrine 实体

如何在喷雾中将所有拒绝转换为自定义 json?

在Javascript中将JSON字符串转换为JSON对象数组

在 PHP 中将对象转换为 JSON 并将 JSON 转换为对象,(像 Gson for Java 之类的库)