Arrays 使用PowerShell创建单元素Json数组对象

Arrays 使用PowerShell创建单元素Json数组对象,arrays,json,powershell,Arrays,Json,Powershell,我创建了一个powershell 5.1脚本,该脚本导入csv文件,处理一些数据,然后在脚本末尾使用ConvertTo json cmdlet将数据对象转换为json格式。我遇到的问题;在我的一个字段中,我需要为对象属性创建一个带括号的数组。所以我需要对象是这样的: "PersonGroups":[ { "Name":"test Name", &

我创建了一个powershell 5.1脚本,该脚本导入csv文件,处理一些数据,然后在脚本末尾使用ConvertTo json cmdlet将数据对象转换为json格式。我遇到的问题;在我的一个字段中,我需要为对象属性创建一个带括号的数组。所以我需要对象是这样的:

"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[]]
    数组中

因此,将要作为一个整体输出的集合包装为单个对象需要aux。如上所示的单元素包装器阵列技术效率较低的替代方法是使用
-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)
  
}