在powershell中从json转换为csv

在powershell中从json转换为csv,json,powershell,csv,scripting,Json,Powershell,Csv,Scripting,这是我的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/

这是我的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的输出是一个数组在管道中传递。这是
convertfromjson
如何编写输出的结果。它可能在一个
Write Output
命令(隐式或其他)中收集所有内容并输出数组,而不是在创建对象时将每个对象流式传输到管道中。这可能是cmdlet编写方式的结果,可能是必要的

您当前的代码可能会生成csv,如:

"Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
"5","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,比如
$Json | ConvertFrom Json | ConvertTo Csv…
,您可能会遇到同样的问题

在Json对象上迭代似乎也能起作用:

$Json = "name,data
Play,http://{gho}.domain.com/
BDomain,domain.com
Charts,2
Compress,0
CompressJ,0" | 
ConvertFrom-Csv | 
ConvertTo-Json

$Json | 
ConvertFrom-Json |
ForEach-Object{ $_ } | 
ConvertTo-Csv -NoTypeInformation
多亏了@notjustme,您可以使用
(…)
来缩短这一时间,如:

($json | ConvertFrom-Json) | ConvertTo-Csv
注:根据更正

所有这些选项本质上都是将数组放在管道前面,以绕过
convertfromjson


同样,我不能100%确定ConvertFrom Json为什么会这样。当我找到一个更正式的解释时,我会更新更多的信息。

convertfromjson的输出是一个数组在管道中传递。这是
convertfromjson
如何编写输出的结果。它可能在一个
Write Output
命令(隐式或其他)中收集所有内容并输出数组,而不是在创建对象时将每个对象流式传输到管道中。这可能是cmdlet编写方式的结果,可能是必要的

您当前的代码可能会生成csv,如:

"Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
"5","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,比如
$Json | ConvertFrom Json | ConvertTo Csv…
,您可能会遇到同样的问题

在Json对象上迭代似乎也能起作用:

$Json = "name,data
Play,http://{gho}.domain.com/
BDomain,domain.com
Charts,2
Compress,0
CompressJ,0" | 
ConvertFrom-Csv | 
ConvertTo-Json

$Json | 
ConvertFrom-Json |
ForEach-Object{ $_ } | 
ConvertTo-Csv -NoTypeInformation
多亏了@notjustme,您可以使用
(…)
来缩短这一时间,如:

($json | ConvertFrom-Json) | ConvertTo-Csv
注:根据更正

所有这些选项本质上都是将数组放在管道前面,以绕过
convertfromjson

同样,我不能100%确定ConvertFrom Json为什么会这样。当我找到更正式的解释时,我将更新更多信息。

以简洁的摘要和跨版本的视角补充:

  • PowerShell[Core]v7+中,不需要额外的工作:将
    |ConvertFrom Json | ConvertTo Csv
    添加到您的代码中即可正常工作

  • Windows PowerShell和PowerShell[Core]v6.x中,您需要强制枚举
    ConvertFrom Json
    的输出,以便
    ConvertTo Csv
    正常工作,因为与PowerShell的通常行为相反,
    ConvertFrom Json
    整体输出Json数组,作为管道的单个对象

    • 这是一个事实,这种行为是不寻常的,促使v7+的变化-请参阅背景信息

    • 强制枚举的最简单方法是使用
      (…)
      ,即将整个数组/集合的输出元素逐个发送到管道

这将产生:

“名称”、“数据”
“播放”,“http://{gho}.domain.com/”
“b域名”,“domain.com”
“图表”,“2”
“压缩”、“0”
“CompressJ”、“0”
以简洁的摘要和跨版本的视角作为补充:

  • PowerShell[Core]v7+中,不需要额外的工作:将
    |ConvertFrom Json | ConvertTo Csv
    添加到您的代码中即可正常工作

  • Windows PowerShell和PowerShell[Core]v6.x中,您需要强制枚举
    ConvertFrom Json
    的输出,以便
    ConvertTo Csv
    正常工作,因为与PowerShell的通常行为相反,
    ConvertFrom Json
    整体输出Json数组,作为管道的单个对象

    • 这是一个事实,这种行为是不寻常的,促使v7+的变化-请参阅背景信息

    • 强制枚举的最简单方法是使用
      (…)
      ,即将整个数组/集合的输出元素逐个发送到管道

这将产生:

“名称”、“数据”
“播放”,“http://{gho}.domain.com/”
“b域名”,“domain.com”
“图表”,“2”
“压缩”、“0”
“CompressJ”、“0”

这是一个重复引用:该问题中的文件不存在,因此我不确定其格式,但将对其进行研究,谢谢。在尝试获取“results”属性时,ps抛出的结果无法找到,如果只执行标准的| convertfrom json | convertto csv,它将返回一些格式化为csv@tawfikboujeh,这里的问题是
ConvertFrom Json
的v7之前的非枚举行为,在链接问题的解决方案中,顺便说一句,它被绕过了,访问属性隐式地导致枚举。这是重复的引用:该问题中的文件不存在,因此我不确定格式,但将研究它,谢谢。当尝试获取“results”属性时,ps抛出的结果无法找到,如果只执行标准的| convertfrom json | convertto csv,它将返回一些格式为csv@tawfikboujeh,这里的问题是
convertfromjson
的v7之前的非枚举行为,顺便说一句,在解决相关问题的过程中忽略了这一点