Разбор файла JSON в powershell с конкретными символами - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь получить значения в powershell внутри определенных символов. В основном у меня есть JSON с тысячами таких объектов

  "Name": "AllZones_APOPreface_GeographyMatch_FromBRE_ToSTR",
  "Sequence": 0,
  "Condition": "this.TripOriginLocationCode==\"BRE\"&&this.TripDestinationLocationCode==\"STR\"",
  "Action": "this.FeesRate=0.19m;this.ZoneCode=\"Zone1\";halt",
  "ElseAction": ""

Я хочу все внутри \ "\"

IE здесь я бы увидел, что BRE и STR это Zone1

Все, что мне нужно, это те 3 вещи, которые выведены.

Я искал, как это сделать с ConvertFrom-Json, но безуспешно, может быть, я просто не нашел хорошую статью по этому вопросу.

Спасибо

1 Ответ

0 голосов
/ 11 мая 2018

Начните с представления вашего JSON в виде строки:

$myjson = @'
{
  "Name": "AllZones_APOPreface_GeographyMatch_FromBRE_ToSTR",
  "Sequence": 0,
  "Condition": "this.TripOriginLocationCode==\"BRE\"&&this.TripDestinationLocationCode==\"STR\"",
  "Action": "this.FeesRate=0.19m;this.ZoneCode=\"Zone1\";halt",
  "ElseAction": ""
}
'@

Затем создайте регулярное выражение, которое соответствует всем значениям от \" до \" длиной не более 10 символов (иначе это будетсопоставить нежелательные результаты).

$regex = [regex]::new('\\"(?<content>.{1,10})\\"')

Затем выполните сравнение с регулярным выражением, вызвав метод Matches() для регулярного выражения.Передайте строку JSON в параметры метода как текст, с которым вы хотите выполнить сравнение.

$matchlist = $regex.Matches($myjson)

Наконец, возьмите группу совпадений content, определенную в регулярном выражении, и извлекитезначения из него.

$matchlist.Groups.Where({ $PSItem.Name -eq 'content' }).Value

Результат

BRE
STR
Zone1

Подход № 2: Используйте регулярные выражения Regex для более точного сопоставления

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

$regex = [regex]::new('(?<=TripOriginLocationCode==\\")(?<OriginCode>\w+)|(?<=TripDestinationLocationCode==\\")(?<DestinationCode>\w+)|(?<=ZoneCode=\\")(?<ZoneCode>\w+)')
$matchlist = $regex.Matches($myjson)

### Assign each component to its own friendly variable name
$OriginCode, $DestinationCode, $ZoneCode = $matchlist[0].Value, $matchlist[1].Value, $matchlist[2].Value

### Construct a string from the individual components
'Your origin code is {0}, your destination code is {1}, and your zone code is {2}' -f $OriginCode, $DestinationCode, $ZoneCode

Результат

Your origin code is BRE, your destination code is STR, and your zone code is Zone1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...