我有一个非常大的JSON文件,有近30000条记录。 一条记录看起来像这样:
{
"adlibJSON": {
"recordList": {
"record": [
{
"@attributes": {
"priref": "4372",
"created": "2011-12-09T23:09:57",
"modification": "2012-08-11T17:07:51",
"selected": "False"
},
"acquisition.date": [
"1954"
],
"documentation.title": [
"A lot of text with a lot of extra double quotes like "this" and "this""
] ... ...
问题在于有很多带有额外双引号的值。这可以是1双引号,但也可以是2或3个额外的双引号。请参阅我的示例中"documentation.title"
的值。
如何找到所有这些引号并用正则表达式替换它们。 我使用sublime text 2来做我的正则表达式,但我不知道如何解决这个特定的问题。
答案 0 :(得分:1)
以下是两个例子:
这些要求具有以下要求:
否则你必须改进它。第二个甚至允许值以空格开头,但也可能有其他一些副作用......
示例1:
\"[A-Za-z0-9][^"]+\"\s*[^,:}\s]
示例2:
\"([A-Za-z0-9\s][^"]+\"\s*[^,:\]}\s]){2}
答案 1 :(得分:0)
如果您有机会使用PHP,并且您可以确保JSON文件将与PRETTY_PRINT一起提供(与您的示例输出中分隔的行)...您可以创建一个PHP文件,您将向其发送文件名和得到纠正的输出。这是一个例子。
header('Content-Type: application/json');
$file = @trim($_GET['file']);
if (empty($file) || ($contents = @file_get_contents($file)) === FALSE) {
// handle errors here
echo json_encode(array('error'=>'Invalid file!'));
exit;
}
function escapeQuotes($m) {
return $m[1].$m[2].preg_replace('~(?<!\\\\)(?<!^)"(?!$)~','\\"',$m[3]).$m[4];
}
$res = preg_replace_callback(
'~^(\s*)("[^"\s]+"\s*:\s*)?(".*")(,?\s*)$~m',
'escapeQuotes',$contents
);
echo json_encode(json_decode($res,true));