PowerShell的ConvertFrom-Json | ConvertTo-Csv

7
我有一份JSON数据,结构如下(这里可能会有些错误,但我使用的数据是正确的):
[{
"id": 12345,
"itemName": "some string",
"sellerId": 123,
"seller": "",
"categoryId": ,
"categoryPath": [
  {
   //more data
  },
  {
   //more data
  }
]}, 
{"id": 12346,
"itemName": "some other string",
"sellerId": 234,
"seller": "",
"categoryId": ,
"categoryPath": [
  {
   //more data
  },
  {
   //more data
  }
]
}]

我希望将其转换为csv格式,以便所选属性名称成为csv标题,它们的值(仅深度1)成为数据。

例如:
id,itemName,sellerId
12345,"some string",123
12346,"some other string",234

我已经尝试了数百种变化的

cat file.json | convertfrom-json | convertto-csv

但是没有一个方法有效。我只得到了包含对象名称/类型的csv数据,而我无法弄清如何仅使用json数据中每个对象的选定属性。


不是什么大问题,但你的输入数据与样本输出不匹配。 - Matt
谢谢指出,我已经让示例输出与输入数据匹配。 - Łukasz
1
我不能在一行中完成它。这个对你有用吗?$converted = Get-Content file.json -raw | ConvertFrom-Json;$converted | Select id,itemName,sellerId | Convertto-CSV -NoTypeInformation。需要先将结果保存到一个变量中,原因我还不知道。之后就可以工作了。 - Matt
我无话可说。它能运行,而且我甚至还想出了如何将其变成一行代码。看起来在 iwr 和 convertfrom-json 周围加上括号可以解决问题。我认为这可能与 Powershell 处理对象的方式有关。无论如何,以下是有效的命令。 (iwr "url" | convertfrom-json) | select id, itemname | convertto-csv -NoTypeInformation - Łukasz
是的...我知道我的问题在哪里了..现在正在回答。 - Matt
1个回答

11

简而言之,您需要做这样的事情:

(Get-Content file.json -Raw | ConvertFrom-Json) | Select id,itemName,sellerId | Convertto-CSV -NoTypeInformation
第一个问题是Get-Content将单个行传递给ConvertFrom-Json,这不是它想要的。使用-Raw开关可以完整地传递它。 (Get-Content file.json -Raw | ConvertFrom-Json)需要用括号括起来,这使我们可以继续使用管道。如果不这样做,属性将无法访问。它似乎试图将整个对象而不是其各个部分传递到管道中。 -NoTypeInformation 可以删除这样的行。
#TYPE Selected.System.Management.Automation.PSCustomObject

谢谢,这真的很有帮助。 - Priya
最后,我已经添加了将数据导出到csv的功能。(Get-Content file.json -Raw | ConvertFrom-Json)|选择id,itemName,sellerId | Convertto-CSV -NoTypeInformation | Set-Content file.csv - Priya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接