如何在 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 Symfony 中将 JSON 转换为 Doctrine 实体