当前位置: 首页 > 面试题库 >

如何在PHP中修复格式错误的JSON?

汤飞
2023-03-14
问题内容

我正在获取JSON格式和唯一可用格式的数据提要。在PHP中,我正在使用json_decode解码JSON,但此操作已中断,并且我发现JSON是在某些地方生成的,其昵称用双引号引起来。我使用以下方法验证了这一点:http
:
//jsonformatter.curiousconcept.com

我无法控制数据的创建,但是当这种格式出现时,我必须处理它。解析后的数据将被放入MySQL TABLE。

例如:

"contact1": "David "Dave" Letterman",

json_decode将返回NULL。如果我手动保存文件,然后将其更改为Dave昵称的单引号,则一切正常。

$json_string = file_get_contents($json_download);
$json_array = json_decode($json_string, true);

如何在json_decode处理损坏的JSON_string中修复损坏的JSON格式?要对文件进行预处理,将昵称的双引号反斜杠,该怎么做?还是将它们更改为单引号?在MySQL中存储像这样的双引号甚至是个好主意吗?

我不知道何时每个数据提要都可能发生这种情况,因此我不想只检查contact1是否具有内部双引号来修复它们。PHP中是否有办法采用如上例所示的行,并在冒号之后的所有内容(除外部双引号之外)都反斜杠?谢谢!

这是tftd提供的正确代码:

<?php
// This:
// "contact1": "David "Dave" Letterman",
// Needs to look like this to be decoded by JSON:
// "contact1": "David \"Dave\" Letterman",

$data ='"contact1": "David "Dave" Letterman",';
function replace($match){
    $key = trim($match[1]);
    $val = trim($match[2]);

    if($val[0] == '"')
        $val = '"'.addslashes(substr($val, 1, -1)).'"';
    else if($val[0] == "'")
        $val = "'".addslashes(substr($val, 1, -1))."'";

    return $key.": ".$val;
}
$preg = preg_replace_callback("#([^{:]*):([^,}]*)#i",'replace',$data);
var_dump($preg);
$json_array = json_decode($preg);
var_dump($json_array);
echo $json_array . "\n";
echo $preg . "\n";
?>

这是输出:

string(39) ""contact1": "David \"Dave\" Letterman","
NULL

"contact1": "David \"Dave\" Letterman",

问题答案:

正如其他人已经指出的那样,最好将JSON格式的问题告知客户。要求他们将错误报告发送给原始开发者/公司,以便他们进行修复。如果他/他们无法解决-
请提供您的解决方案。您只需要addslashes在字符串之前就可以json_encode了。

如果由于某种原因最终不得不进行fix格式化,则可以采用以下方法:

$data = '"contact1": "David "Dave" Letterman", "contact2": "Peter "Robert" Smith",{\'test\': \'working "something"\'}';
function replace($match){
    $key = trim($match[1]);
    $val = trim($match[2]);

    if($val[0] == '"')
        $val = '"'.addslashes(substr($val, 1, -1)).'"';
    else if($val[0] == "'")
        $val = "'".addslashes(substr($val, 1, -1))."'";

    return $key.": ".$val;
}
$preg = preg_replace_callback("#([^{:]*):([^,}]*)#i",'replace',$data);
var_dump($preg);
// string '"contact1": "David \"Dave\" Letterman", "contact2": "Peter \"Robert\" Smith",{'test': 'working \"something\"'}' (length=110)

请记住,如果有人再次弄乱json格式,这可能会中断。



 类似资料:
  • db_connection=mysql, db_host=localhost db_port=3306 db_database=example db_username=root db_password= 这是一条错误消息 1条理\dbal\driver\pdoException::(“SQLSTATE[HY000][2002]没有这样的文件或目录”)/文档/清洁/示例/供应商/条理/dbal/li

  • 现在,我不知道有什么方法可以用这种格式解析给定的日期。

  • 我在下面的代码中的Foreach循环中遇到错误,有人能帮我修复错误吗。。。

  • 我得到未定义的索引错误。我在同一个网站上看到了一个类似类型的问题。我无法修复这个错误,有人能帮助我吗

  • 问题内容: 运行脚本时,出现如下错误: 警告:不能更改头信息-已经(发送了头输出在/some/file.php:12开始)在/some/file.php上线23 错误消息中提到的行包含和调用。 这可能是什么原因?以及如何解决? 问题答案: 发送头之前无输出! 在进行任何输出之前,必须调用发送/修改HTTP标头的函数。 否则,调用将失败: 警告:无法修改标头信息-标头已发送(输出从script:li

  • 我试图解决这个问题已经有一段时间了,但我所尝试的一切都是无用的。我尝试了HttpClientHandler,但仍然得到了错误! 错误消息: 无法建立SSL连接,请参阅内部异常 身份验证失败,请参阅内部异常 收到的消息意外或格式不正确 我从零开始学习c#,而且我对c#语言非常熟悉,所以请解释一下问题所在。