Удалите свойства объекта JSON, которые соответствуют регулярному выражению в PowerShell - PullRequest
1 голос
/ 10 июля 2019

Приведенный пример объекта json, например:

{
  "Id": 1,
  "Name": "Pablo",
  "UnwantedProperty1XOXO": true,
  "UnwantedProperty2XOXO": false,
  ...
}

Я хочу удалить все свойства, оканчивающиеся на XOXO (поэтому регулярное выражение будет выглядеть примерно так: /.+XOXO$).

Как удалить все свойства с именами, которые соответствуют регулярному выражению с PowerShell? (либо с объектом JSON, либо с объектом PowerShell)

Я могу удалить свойства из объекта PowerShell следующим образом, но он не работает с регулярными выражениями: $myObject.PSObject.Properties.Remove("someProperty")

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Самым надежным решением является , а не для использования синтаксического анализа текста на основе регулярных выражений , который хрупкий (пара свойство-значение может быть разбита на несколько строк, значение может случайно соответствовать свойству имя для исключения).

Вместо:

  • Используйте ConvertFrom-Json длявыполнить правильный анализ JSON в пользовательских объектах ([pscustomobject] экземпляры) ...
  • ... и затем использовать Select-Object -Exclude с шаблоном подстановки чтобы исключить неинтересные свойства ...

  • ... и преобразовать обратно в JSON с ConvertTo-Json, если необходимо.

Get-Content -Raw file.json |
  ConvertFrom-Json |
    Select-Object * -ExcludeProperty *XOXO |
      ConvertTo-Json

Примечание. Аргумент [-Property] *, передаваемый Select-Object, требуется только в Windows PowerShell ;PowerShell Core разумно предполагает -Property *, если указано только -ExcludeProperty.

1 голос
/ 10 июля 2019

Вы можете импортировать содержимое файла с помощью Get-Content, а затем использовать встроенные операторы регулярных выражений для этого.

$data = Get-Content C:\Users\U394282\Desktop\test.json

Мы хотим установить $unwantedProps для массива (в этом примере он использует символ @ () для инкапсуляции результатов, и поэтому он всегда имеет свойство .Count

$unwantedProps = @($data | ? { $_ -match 'XOXO'})

if($unwantedProps.Count -gt 0)
{
    $cleanedData = $data -notmatch 'XOXO'    
    return $cleanedData
}
else {
    return
}

В зависимости от структуры файла JSON и того, какая позиция индекса удаляется в результате, вы также можете использовать вспомогательную функцию, которая будет проверять наличие запятой в самом последнем элементе, делая JSON недействительным:

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