对象中的ConvertTo-Json,数组作为属性值 动态确定列名:

在Windows Powershell中,我有一个简单的Invoke-SqlCmd查询,该查询返回下表:

ID Text
-- ----
 1 FOO 
 2 BAR 
 3 SPAM

将其插入| ConvertTo-Json -Depth 1会产生以下结果:

[
    {
        "RowError":  "","RowState":  1,"Table":  "","ItemArray":  "1 FOO","HasErrors":  false,"ID":  1,"Text":  "FOO"
    },{
        "RowError":  "","ItemArray":  "2 BAR","ID":  2,"Text":  "BAR"
    },"ItemArray":  "3 SPAM","ID":  3,"Text":  "SPAM"
    }
]

我想要的输出不是这个裸露的数组,而是一个具有单个属性且具有“产品”作为名称和值为值的数组的对象

此外,我希望我的数组条目是objecs,仅将SQL表的列作为属性。

也就是说,我想要的输出将是:

{
    "Products": [
        {
            "ID": 1,"Text": "FOO"
        },{
            "ID": 2,"Text": "BAR"
        },{
            "ID": 3,"Text": "SPAM"
        }
    ]
}

我该如何实现?


编辑:SQL Server Management Studio中的查询及其结果如下:

对象中的ConvertTo-Json,数组作为属性值
      
    动态确定列名:

Evly_Js 回答:对象中的ConvertTo-Json,数组作为属性值 动态确定列名:

假设$queryResult包含您的Invoke-SqlCmd通话结果:

[pscustomobject] @{ 
  Products = @($queryResult | Select-Object ID,Text)
} | ConvertTo-Json
  • Select-Object创建[pscustomobject]实例,这些实例仅包含代表实际表列的属性,在这种情况下为硬编码。

    • 注意:动态地确定这些列名可提供更通用的解决方案-请参阅下一节。
  • @()(即array-subexpression operator)可确保将结果视为一个数组(以防您的查询碰巧只返回一个行)。

  • [pscustomobject] @{ ... }是用于创建包装器[pscustomobject]实例的语法糖,该实例的唯一属性Products包含仅列值对象的数组。

  • ConvertTo-Json将生成的自定义对象转换回JSON。

    • 虽然这里不是问题,但请注意默认情况下递归深度限制为 2 ,因此必须显式使用-Depth来防止数据丢失-请参见this post。 / li>

动态确定列名:

Mathias R. Jessen,在Fry Simpson的协助下,制定了此解决方案。

通过进行Invoke-SqlCmd调用,返回一个System.Data.Table实例
通过-OutputAs DataTables.Column.ColumnNames可用于将查询的列名提取为数组:

# Note the use of `-OutputAs DataTables`; `-As DataTables` should work too.
$queryResult = Invoke-SqlCmd -OutputAs DataTables -Query "SELECT * FROM Schema1.dbo.Table_1" -ServerInstance $instanceName -Database $databaseName  

[pscustomobject] @{ 
  Products = @($queryResult | Select-Object $queryResult.Columns.ColumnName) 
} | ConvertTo-Json 

默认情况下,Invovke-SqlCmd返回单个System.Data.DataRow实例的流。

请注意,即使$queryResult包含一个System.Data.DataTable实例,其也会通过管道隐式发送,该如何使用?换句话说:$queryResult | ...$queryResult.Rows | ...相同,后者是PowerShell内置的行为。

本文链接:https://www.f2er.com/2576079.html

大家都在问