Powershell:将JSON嵌套数组重新格式化为对象数组

时间:2015-11-09 16:12:58

标签: arrays json powershell

我正在尝试修改格式错误的JSON文本文件,目前看起来像这样:

[
    ["val1", "val2", "val3", "val4"],
    ["val5", "val6", "val7", "val8"],
    ["val9", "val10", "val11", "val12"]
]

我还有一个包含字段名称的其他数组

["title1", "title2", "title3", "title4"]

我想输出一个如下所示的final.json文本文件:

[
    {"title1": "val1", "title2": "val2", "title3": "val3", "title4": "val4"}, 
    {"title1": "val5", "title2": "val6", "title3": "val7", "title4": "val8"},
    {"title1": "val9", "title2": "val10", "title3": "val11", "title4": "val12"}
]

我想最好的方法是取每行,按,拆分,然后将它们重新添加到标题名称上,但我不确定如何在PowerShell中执行此操作

2 个答案:

答案 0 :(得分:2)

由于您在这里处理结构化数据,我认为最好的方法是解析JSON,并使用生成的对象。创建所需的对象,然后转换回JSON:

$j1 = @'
[
    ["val1", "val2", "val3", "val4"],
    ["val5", "val6", "val7", "val8"],
    ["val9", "val10", "val11", "val12"]
]
'@

$j2 = @'
["title1", "title2", "title3", "title4"]
'@

$a1 = $j1 | ConvertFrom-Json
$a2 = $j2 | ConvertFrom-Json

0..($a1.Count-1) | ForEach-Object {
    $i = $_
    $props = @{}
    0..($a2.Count-1) | ForEach-Object {
        $props[$a2[$_]] = $a1[$i][$_]
    }
    New-Object PSOBject -Property $props
} | ConvertTo-Json

ConvertTo-JsonConvertFrom-Json是序列化/反序列化JSON所需的cmdlet。然后你就可以使用这些对象了。

在这种情况下,我将浏览$a1中的每个顶级数组,并创建包含所需属性的哈希表。然后我用这些属性创建PSObject。从ForEach-Object cmdlet返回(结果是这些对象的数组),然后将其直接传送到ConvertTo-Json以提供所需的输出。

答案 1 :(得分:2)

我认为更好的方法是通过ConvertFrom-Json读取第一个JSON格式,然后获取该数组数组,并为每一行从哈希表创建一个PSCustomObject,例如: [PSCustomObject]@{title1=$arr[$row][0]; title2=$arr[$row][1];...}。一旦你有了PSCustomObject的数组,用ConvertTo-Json将它转换回JSON。