2

我有一个 json 文件,它的值中有很多双引号。json文件差不多有27000条记录。

我想删除或替换值内的双引号,否则它不会被接受为一个好的 json 文件。我怎样才能做到这一点?

问题是值中有一个双引号的记录,但其中也有多个引号的记录。

除了替换或删除引号之外,还可以删除整个键和值。反正我不会用。这样做更容易吗?

以下是 json 文件中 1 条记录的示例:

 {
  "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""
          ] ... ...

问题在于键的值:document.title. 我有 sublime text 2,我用它来查找和替换。

4

3 回答 3

1

有一种方法,但为了做到这一点,您必须确保您可以对您的数据进行以下假设:

  • “documentation.title”在您的数据中只能出现一次,当它用作键时。
  • “documentation.title”引用的数组值应该只有一个元素。
  • 字符“]”不应出现在值中。

然后,您将按照以下步骤操作:

/* find first index of "[" after "documentation.title" */
n = s.indexOf("[", s.indexOf('"documentation.title"'));

/* Find index of closing "]" */
n2 = s.indexOf("]", n);

/* Get the substring enclosed by these indexes */
x = s.substr(n+1, n2-n-1);

/* Remove every double quotes in this string and rebuild the original string with the corrected value. */
s.substr(0, n) + '["' + x.replace(/"/g, "") + '"]' + s.substr(n2+1);

编辑:如果您对保留更正值本身不感兴趣,则可以将其替换为空字符串。

于 2013-01-29T21:02:17.247 回答
0

我认为您不能,因为它不是常规语言

您可能会遇到与使用 regex 解析 HTML类似的麻烦。

我认为你必须自己编写(或者如果你非常幸运的话)某种解析器......

于 2013-01-29T20:59:46.507 回答
0

试试这个:

json.replace(/(^\s*|:\s*)"/gm, '$1[sentinel]')
    .replace(/"(,?\s*$|:)/gm, '[sentinel]$1')
    .replace(/"/g, '\\"').replace(/\[sentinel\]/g, '"');

演示在这里:http: //jsfiddle.net/D83FD/

这不是一个完美的解决方案;数据的格式可能会破坏正则表达式。试试看它是否适用于更大的数据集。

本质上,我们正在查找开始引号并将它们替换为占位符值,查找结束引号并将它们替换为占位符,反斜杠转义所有剩余的引号,然后再次将占位符替换为引号。

于 2013-01-29T21:47:23.427 回答