Форсирование одного результата в виде массива в выводе JSON - PullRequest
0 голосов
/ 02 апреля 2019

Я получаю данные инвентаризации из базы данных SQL, и я хочу преобразовать ее в JSON для дальнейшей обработки.

Есть отдельные запросы для операционной системы, процессоров и приложений (Добавить и удалить информацию).

Для ОС обычно возвращается одна строка, для процессоров - одна или несколько строк, а для приложений - обычно пара строк.

Извлечение данных выполняется следующим образом (эта часть работает нормально):

$deviceOperatingSystem = Invoke-Sqlcmd -ServerInstance $sqlServer -Database $sqlDatabase -Query $inventoryOperatingSystemQuery -credential $databaseCredentials -Variable $variables
$deviceProcessors = Invoke-Sqlcmd -ServerInstance $sqlServer -Database $sqlDatabase -Query $inventoryProcessorsQuery -credential $databaseCredentials -Variable $variables
$deviceApplications = Invoke-Sqlcmd -ServerInstance $sqlServer -Database $sqlDatabase -Query $inventoryApplicationsQuery -credential $databaseCredentials -Variable $variables

затем он подается в массив следующим образом:

$deviceInventoryOutput = @()
    $deviceInventoryOutput += [PSCustomObject]@{
        'OperatingSystem'    = $deviceOperatingSystem
        'Processors'         = $deviceProcessors     
        'Applications'       = $deviceApplications   
                    }

и вывод выглядит так:

{
    "OperatingSystem":  {
                            "Caption":  "Microsoft Windows 10 Enterprise",
                            "Version":  "10.0.16299",
                            "BuildNumber":  "16299",
                            "ServicePackMajorVersion":  0,
                            "Language":  1031
                        },
    "Processors":  {
                       "Name":  "Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz",
                       "Description":  "Intel64 Family 6 Model 78 Stepping 3",
                       "Manufacturer":  "GenuineIntel",
                       "NumberOfCores":  1,
                       "NumberOfLogicalCores":  1
                   },
    "Applications":  [
                         {
                             "Name":  "IM.order",
                             "Publisher":  "Ingram Micro Distribution GmbH",
                             "Version":  "6.41.761.0"
                         },
                         {
                             "Name":  "JTL-Wawi",
                             "Publisher":  "JTL-Software-GmbH",
                             "Version":  "1.2.3.7"
                         },...
}

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

{
    "Processors":  [{
                       "Name":  "Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz",
                       "Description":  "Intel64 Family 6 Model 78 Stepping 3",
                       "Manufacturer":  "GenuineIntel",
                       "NumberOfCores":  1,
                       "NumberOfLogicalCores":  1
                   }]
}

Я пытался обернуть переменную процессоров следующим образом

'Processors'         = @($deviceProcessors)

но это не сильно помогло. Я также попытался инициализировать $ deviceProcessors в виде массива, подобного:

$deviceProcessors = @()
$deviceProcessors += Invoke-Sqlcmd -ServerInstance $sqlServer -Database $sqlDatabase -Query $inventoryProcessorsQuery -credential $databaseCredentials -Variable $variables

но нет, не получилось.

 $deviceProcessors.GetType() returns System.Data.DataRow
 $deviceApplications.GetType() returns System.Object[]

Ожидаемый вывод должен иметь [] вокруг информации для процессоров, если из запроса возвращается только один результат.

1 Ответ

0 голосов
/ 02 апреля 2019

Следующий фрагмент кода должен выполнить работу:

$deviceInventoryOutput = @()
$deviceInventoryOutput += [PSCustomObject]@{
    'OperatingSystem'    = $deviceOperatingSystem
    'Processors'         = $deviceProcessors     
    'Applications'       = $deviceApplications   
}
# possible additional `$deviceInventoryOutput += [PSCustomObject]@{…}` here

for ( $i = 0; $i -lt $deviceInventoryOutput.Count; $i++ ) {
  foreach ( $aux in $( $deviceInventoryOutput[$i] | 
                            Get-Member -MemberType NoteProperty ).Name ) {
      if ( $deviceInventoryOutput[$i].$aux.Gettype().name -ne 'Object[]' ) {
          $deviceInventoryOutput[$i].$aux = @($deviceInventoryOutput[$i].$aux)
      }
  }
}
$deviceInventoryOutput | ConvertTo-Json -Depth 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...