0

我有一个非常大的 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 来做我的正则表达式,但我不知道如何解决这个具体问题。

4

2 回答 2

1

这里有两个例子:

这些有以下要求:

  • 值不以逗号、冒号、右大括号或空格开头。

否则你必须改进它。第二个甚至允许值以空格开头,但也可能有一些其他副作用......

示例 1:

\"[A-Za-z0-9][^"]+\"\s*[^,:}\s]

示例 2:

\"([A-Za-z0-9\s][^"]+\"\s*[^,:\]}\s]){2}
于 2013-01-23T14:32:11.443 回答
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));
于 2013-01-25T04:19:22.260 回答