Arrays 使用PowerShell创建单元素Json数组对象
我创建了一个powershell 5.1脚本,该脚本导入csv文件,处理一些数据,然后在脚本末尾使用ConvertTo json cmdlet将数据对象转换为json格式。我遇到的问题;在我的一个字段中,我需要为对象属性创建一个带括号的数组。所以我需要对象是这样的:Arrays 使用PowerShell创建单元素Json数组对象,arrays,json,powershell,Arrays,Json,Powershell,我创建了一个powershell 5.1脚本,该脚本导入csv文件,处理一些数据,然后在脚本末尾使用ConvertTo json cmdlet将数据对象转换为json格式。我遇到的问题;在我的一个字段中,我需要为对象属性创建一个带括号的数组。所以我需要对象是这样的: "PersonGroups":[ { "Name":"test Name", &
"PersonGroups":[
{
"Name":"test Name",
"Id": 3433
}
]
下面是对函数的调用:
$_.PersonGroups = Set-DataHash -InputObject $_
以下是我的代码:
function Set-DataHash{
param(
[psobject] $InputObject
)
$customObject = [psobject]@{
Name = "Test"
Id = 78888
}
$customArray = @($customObject)
return $customArray
}
当然,如果数组中有多个对象,它就可以正常工作;但由于它只有一个对象,转换为Json使它成为一个对象。有什么建议吗?怎么样:
$_.PersonGroups = @(Set-DataHash -InputObject $_)
您不需要“return”。展示了如何在调用方方面解决问题,使用@()
,围绕Set DataHash
函数调用,以确保返回值是数组
如果要从函数内部解决问题,必须确保输出(返回)的数组作为一个整体作为单个对象输出,这可以通过使用(一元形式)创建的辅助单元素包装数组来实现
说明:
默认情况下-无论您是在函数或脚本中使用return
还是隐式输出-输出集合(包括数组)会导致枚举其元素(也称为流式、展开或展开);也就是说,元素一个接一个地输出到(在本例中是不可见的)管道,调用者通过该管道接收输出
- 对于单个元素集合,管道的性质是调用者只接收单个元素本身-集合包装器丢失。
- 在多元素集合的情况下,特定的原始集合也会丢失,并且枚举的元素会自动收集到
数组中[object[]]
-NoEnumerate
开关,这也会阻止枚举作为参数传递给它的集合(而不是通过管道)
注:
- 一般来说,在打算由其他人直接调用的函数/脚本中,最好不要将集合作为一个整体输出,以免混淆管道中流式(枚举)行为的一般预期;在流式处理的情况下,调用者必须通过
确保收集的输出是一个数组,如js2010的回答所示;有关背景信息,请参阅@(…)
- 但是,反过来,输出集合作为一个整体会更快,并允许您输出特定的集合类型
转换为json
?这是否回答了您的问题@Lee_Dailey:JSON是这个问题的最终附带问题,它的核心是如何从函数输出(返回)集合作为一个整体。非常感谢您的帮助。我同意不需要返回,但我讨厌VS代码给我一个警告,通知我变量已分配但未使用。这对我来说简直是一个疯狂的检查,还是我想的全错了?你也不必分配任何变量。只需单独放置一个[pscustomobject]表达式。
function Set-DataHash {
param(
[psobject] $InputObject
)
$customObject = [psobject] @{
Name = "Test"
Id = 78888
}
# Wrap $customObject in an array with @(...),
# then *additionally* wrap this array in an *auxiliary* single-element array,
# via `,` (array-construction operator).
# Outputting this aux. array causes *it* to be enumerated, which therefore
# outputs its only element as-is: the *original* array - see explanation below.
# Note: I've omitted `return`, which is always optional.
, @($customObject)
}