我得到了一个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中存储这样的双引号是一个好主意吗?
我不知道每次数据馈送时什么时候会发生这种情况,所以我不想只检查contact 1是否有内部双引号来修复它们。在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",
型
6条答案
按热度按时间cyej8jka1#
我有一个自己的jsonFixer()函数--它分两步工作:删除垃圾(用于不一致格式的平等)和重新格式化。
字符串
使用示例:
型
将导致:
型
注意:这并没有测试所有可能的格式不好的JSON字符串,但我使用一个复杂的多级JSON字符串,并在此之前工作得很好。
cbeh67ev2#
正如其他人已经指出的,最好告诉你的客户JSON格式的问题。让他们发送一个bugreport给原始开发人员/公司,这样他们就可以修复它。如果他/他们不能修复它-然后提供你的解决方案。你只需要在
json_encode
之前addslashes
字符串。如果出于某种原因,你最终不得不
fix
,这里有一种方法可能对你有用:字符串
请记住,如果有人再次弄乱json格式,这可能会中断。
iqjalb3h3#
正如其他人所说,你可以做一个搜索和替换,但困难的部分是创建模糊匹配规则,因为为了解析它,你需要假设一些事情。可能,你需要假设:
1a)键不包含冒号
1b)或关键引号被正确转义
和
2a)值不包含逗号
2b)或值有正确的转义引号。
即使这样,你也可能会遇到解析混乱的情况,如果他们在JSON中有注解,情况会更糟。(不符合,但很常见。)
现在,根据数据的不同,你可以使用换行符来决定你什么时候看到一个新的键,但是同样,这是不可靠的,你开始做大的假设。
所以,长话短说,你要么必须做出一些可能在任何时候都是错误的假设,要么你需要让他们来修复数据。
rqmkfv5c4#
告诉他们在输出之前转义字符串。你甚至可以提供修复它或提供代码解决方案。
否则,可以将preg_replace与正则表达式一起使用
参见Replacing specified double quotes in text with preg_replace
8qgya5xd5#
当值中包含逗号和[]时,Regexp是不可靠的,它包含json字符串,担心和噩梦开始。在php json_decode fails without quotes on key中,建议使用pear Services_JSON,如果类名的代码固定,无效json的游戏结束,它可以实现最安全的结果:
字符串
jw5wzhpr6#
字符串