Я получаю данные инвентаризации из базы данных 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[]
Ожидаемый вывод должен иметь [] вокруг информации для процессоров, если из запроса возвращается только один результат.