【问题标题】:How to convert non json string to a valid json string in PHP如何在 PHP 中将非 json 字符串转换为有效的 json 字符串
【发布时间】: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,这确实是问题所在。

标签: php 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("/\s{1,}/", ":", $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);
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2023-03-22
      • 2017-03-03
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多