Как отредактировать определенные json атрибуты? Может ли регулярное выражение на VSCode работать? - PullRequest
0 голосов
/ 23 января 2020

У меня есть файл json с массивом таких объектов:

[
  {
    "_index": "db",
    "_type": "service",
    "_id": "1",
    "_score": 4.0,
    "_source": {
      "contentId": "1",
      "title": "Sample 1",
      "tokenizer": "whitespace",
      "keyword": ["sample1", "service"],
      "desp": "Desc this Service",
      "contentType": "service",
      "url": null,
      "contentCategory": "Services",
      "contentSubCategory": null,
      "assignmentProfile": null,
      "employeeId": null,
      "assignmentProfileId": null,
      "managedRuleId": null,
      "contentAcademy": null,
      "imageUrl": null,
      "metaData": [
        "sample1",
        "services"
      ]
    }
  },
  {
    "_index": "db",
    "_type": "service",
    "_id": "2",
    "_score": 7.0,
    "_source": {
      "contentId": "2",
      "title": "Sample 2",
      "tokenizer": "whitespace",
      "keyword": ["sample2", "service"],
      "desp": "Desc this Service",
      "contentType": "service",
      "url": null,
      "contentCategory": "Services",
      "contentSubCategory": null,
      "assignmentProfile": null,
      "employeeId": null,
      "assignmentProfileId": null,
      "managedRuleId": null,
      "contentAcademy": null,
      "imageUrl": null,
      "metaData": [
        "sample2",
        "services"
      ]
    }
  }
]

Мне нужно удалить некоторые поля в этом. Все поля начинаются с полей _ и metadata. Это должно закончиться так:

[
  {
    "contentId": "1",
    "title": "Sample 1",
    "tokenizer": "whitespace",
    "keyword": ["sample1", "service"],
    "desp": "Desc this Service",
    "contentType": "service",
    "url": null,
    "contentCategory": "Services",
    "contentSubCategory": null,
    "assignmentProfile": null,
    "employeeId": null,
    "assignmentProfileId": null,
    "managedRuleId": null,
    "contentAcademy": null,
    "imageUrl": null
  },
  {
    "contentId": "2",
    "title": "Sample 2",
    "tokenizer": "whitespace",
    "keyword": ["sample2", "service"],
    "desp": "Desc this Service",
    "contentType": "service",
    "url": null,
    "contentCategory": "Services",
    "contentSubCategory": null,
    "assignmentProfile": null,
    "employeeId": null,
    "assignmentProfileId": null,
    "managedRuleId": null,
    "contentAcademy": null,
    "imageUrl": null
  }
]

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

"metaData": \[\r\n (.+) ],

, чтобы заменить атрибут metaData пустой строкой. Но это не совпадает.

Размер массива составляет 100+, и, таким образом, есть выражение, чтобы сопоставить это с?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Попробуйте это в vscode:

(^\s*"_.*"?\n)|(,\n^\s*"metaData":\s*\[[\s\S]+?\s+\])|(^\s{4,}\}$\n)|(^\s{2}(?![\{\}]))

и ничего не заменяйте.

Полное объяснение см. regex101 demo .

Есть 4 альтернативы:

(^\s*"_.*"?\n) get "_index": "db",, например, включая завершающий перевод новой строки

(,\n^\s*"metaData":\s*\[[\s\S]+?\s+\]) get "metaData": [...] и предшествующий , в конце предыдущей записи, чтобы исключить завершающий символ , последней записи в каждом поле.

(^\s{4,}\}$\n) получить }, который был закрывающей скобкой, из "_source": {, то есть больше не требуется.

(^\s{2}(?![\{\}])) только для исправления отступа, поскольку "_source": {...} был удален - получает первые два пробела во всех строках без { или } после них. [Возможно, вам придется поиграть с удаленными 2 пробелами в зависимости от настроек отступов.]

Вы можете исключить эту последнюю альтернативу, если хотите просто отформатировать документ Shift + Alt + F вместо этого - он должен удалить эти пробелы. Я заметил, однако, что переформатирование таким образом переформатирует ваши:

"keyword": ["sample1", "service"], 

в

 "keyword": [
   "sample1",
   "service"
 ],

, которые вас могут волновать или нет.

json regex demo


0 голосов
/ 23 января 2020

У меня есть решение, но я не уверен, что оно будет работать на VSCode

Я пробовал это решение на Sublime Text Editor, и оно работает нормально. Так что я думаю, что оно также будет работать на VSCode.

Шаги для решения вашей первой проблемы (строка начинается с "_):

  1. Откройте файл Json в Sublime Text Editor
  2. Нажмите ctrl+H а затем нажмите на символ .*, чтобы включить регулярное выражение (убедитесь, что .* включено).
  3. , затем введите это регулярное выражение ^.*"_.*\n в разделе find и оставьте раздел Replace пустым и нажмите Replace (не пишите ничего в Replace разделе)

Шаги для решения вашей первой проблемы (весь блок metaData):

  1. Откройте ваш Json файл в Sublime Text Editor
  2. Нажмите ctrl+H и затем нажмите на символ .*, чтобы включить регулярное выражение (Убедитесь, что .* включено).
  3. , затем введите это регулярное выражение \"metadata[^}]*\] в секции find и оставьте секцию Replace пустой и нажмите Replace (ничего не пишите в секции Replace)

не забудьте включить символ .* (см. ниже im возраст)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...