如何解决在Powershell中从JSON转换为CSV
这是我的csv:
"name,data
Play,http://{gho}.domain.com/
BDomain,domain.com
Charts,2
Compress,0
CompressJ,0" | ConvertFrom-Csv | ConvertTo-Json
给我:
[
{
"name": "Play","data": "http://{gho}.domain.com/"
},{
"name": "BDomain","data": "domain.com"
},{
"name": "Charts","data": "2"
},{
"name": "Compress","data": "0"
},{
"name": "CompressJ","data": "0"
}
]
我现在想从json中获取该csv,但是|的链ConvertFrom-Json | ConvertTo-CSV无法正常工作,我很好奇为什么不这样做?
解决方法
ConvertFrom-Json
的输出是将单个数组照这样沿管道传递。这是ConvertFrom-Json
如何写入输出的结果。它可能正在收集所有内容并通过一个Write-Output
命令(隐式或其他方式)输出数组,而不是在创建每个对象时将它们向下流到管道中。这可能是cmdlet编写方式的结果,并且可能是必需的。
您当前的代码可能会生成如下的csv:
"Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
"5","5","1","System.Object[]","False","True","False"
这些是数组的属性,而不是数组中的对象。解决该问题的一种方法是将数据存放在变量中:
$Json = "name,data
Play,http://{gho}.domain.com/
BDomain,domain.com
Charts,2
Compress,0
CompressJ,0" |
ConvertFrom-Csv |
ConvertTo-Json
# Now you can convert back to csv without issue:
$Json = $Json | ConvertFrom-Json
$Json | ConvertTo-Csv -NoTypeInformation
请注意:如果您像
$Json | ConvertFrom-Json | ConvertTo-Csv...
一样直接发送$ Json,则可能会遇到相同的问题。
遍历Json对象似乎也可行:
$Json = "name,0" |
ConvertFrom-Csv |
ConvertTo-Json
$Json |
ConvertFrom-Json |
ForEach-Object{ $_ } |
ConvertTo-Csv -NoTypeInformation
由于@notjustme,您可以使用(...)
来缩短它,例如:
($json | ConvertFrom-Json) | ConvertTo-Csv
注意:已根据mklement0's answer进行了修正。
所有这些选项实际上都是将数组放置在管道的前面,以绕过ConvertFrom-Json
的内部行为
还是不能100%确认为什么ConvertFrom-Json会这样。当我找到更正式的解释时,将使用其他信息进行更新。
,以简洁的摘要和跨版本的观点补充Steven's helpful answer:
-
在 PowerShell [Core] v7 + 中,不需要额外的工作:将
| ConvertFrom-Json | ConvertTo-Csv
附加到您的代码中可以按原样进行。 -
在 Windows PowerShell和PowerShell [Core] v6.x 中,您需要强制枚举
ConvertFrom-Json
的输出,以使{ {1}}正常工作,因为与PowerShell的通常行为相反,ConvertTo-Csv
将JSON数组整体作为单个对象输出到管道。-
此行为是不寻常的事实,促使v7 +发生了变化-有关背景信息,请参见this answer。
-
强制枚举的最简单方法-即将输出为一个整体的数组/集合的元素一对一发送到管道中是使用
ConvertFrom-Json
, grouping operator。
-
(...)
这将产生:
# Works in all PowerShell versions,but in v7+ the (...) is no longer necessary.
(
"name,0" | ConvertFrom-Csv | ConvertTo-Json |
ConvertFrom-Json
) | ConvertTo-Csv -NoTypeInformation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。