Различная оценка для ConvertFrom-Json - PullRequest
0 голосов
/ 04 декабря 2018

Почему два следующих фрагмента дают различный вывод?

Get-Content -Raw "test.json" | ConvertFrom-Json | %{
    Write-Output "MessageType: $($_.Messagetype)"
}
# this time make sure Get-Content and ConvertFrom-Json are evaluated completely, before the foreach
(Get-Content -Raw "test.json" | ConvertFrom-Json) | %{
    Write-Output "MessageType: $($_.Messagetype)"
}

Выполнение фрагментов со следующим json:

[
  {
    "MessageType": "A"
  },
  {
    "MessageType": "B"
  }
]

, первый скрипт выдает

MessageType: A B

и второй ожидаемый

MessageType: A
MessageType: B

Таким образом, в основном для первого фрагмента foreach получает один элемент, представляющий собой массив из 2 элементов, в то время как во втором фрагменте foreach вызывается для каждого элемента.

Я не понимаю, почему форсирование оценки полностью меняет здесь поведение.

1 Ответ

0 голосов
/ 04 декабря 2018

ConvertFrom-Json, в отличие от большинства других командлетов, выводит массивы в виде отдельных объектов вместо отправки объектов один за другим по конвейеру. [1]

Следовательно, в вашем первом блоке сценария % (ForEach-Object) команды $_ представляет собой весь массив , который внутри расширяемой строки ("...") переводит в список его элементов, разделенных пробелами по умолчанию.

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

Следовательно, ваша секунда команды % (ForEach-Object) блок сценария вызывается дважды , с $_, привязанным к одному объекту каждый.

Упрощенные примеры:

# Sample JSON that is an array comprising 2 objects.
$json = '[
  {
    "MessageType": "A"
  },
  {
    "MessageType": "B"
  }
]'

# -> 1, because ConvertFrom-Json sent the array as a whole
$json | ConvertFrom-Json | Measure-Object | % Count

# -> 2, because using (...) resulted in enumeration
($json | ConvertFrom-Json) | Measure-Object | % Count

[1] Это необычное поведение обсуждается в этом выпуске GitHub .

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