У меня есть файл JSON, который имеет много двойных кавычек внутри значений. Файл JSON почти 27000 записей.

Я хочу удалить или заменить двойные кавычки внутри значений, потому что в противном случае он не будет принят в качестве хорошего файла JSON. Как я могу это сделать?

Проблема в том, что есть записи с одной двойной кавычкой внутри значения, но есть также записи с несколькими кавычками внутри них.

Вместо замены или удаления кавычек, также можно удалить весь ключ и значение. Я не собираюсь использовать это в любом случае. Это легче сделать?

Вот пример 1 записи в файле json:

 {
  "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. У меня есть возвышенный текст 2, который я использую, чтобы найти и заменить.

2
user1386906 29 Янв 2013 в 17:30

3 ответа

Лучший ответ

Есть способ, но для этого вы должны быть уверены, что можете сделать следующие предположения относительно ваших данных:

  • «document.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);

Редактировать: если вы не заинтересованы в сохранении самого исправленного значения, вы можете просто заменить его пустой строкой.

1
Cyrille Ka 29 Янв 2013 в 21:09

Попробуй это:

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

Демонстрация здесь: http://jsfiddle.net/D83FD/

Это не идеальное решение; возможно, что данные могут быть отформатированы таким образом, что это нарушает регулярное выражение. Попробуйте и посмотрите, работает ли он для большего набора данных.

По сути, мы находим открывающие кавычки и заменяем их значением заполнителя, находим закрывающие кавычки и заменяем их заполнителем, экранируем обратной косой чертой все оставшиеся кавычки, а затем снова заменяем заполнители кавычками.

0
Dagg Nabbit 29 Янв 2013 в 21:47

Я не думаю, что вы можете, так как это не обычный язык.

Вероятно, у вас будут проблемы, аналогичные тем, которые возникают при анализе HTML с помощью регулярных выражений.

Я думаю, вам придется написать (или найти, если вам супер везет) какой-то парсер самостоятельно ...

0
Community 23 Май 2017 в 11:54