Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell convertfrom-json | convertto-csv

I have a JSON data structured as following (there may be some mistakes here, the data I'm using is fine):

[{
"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
  }
]
}]

I would like to convert it to csv so that the selected property names become csv headers and their value (depth 1 only) become data. e.g

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

I've tried using hundreds of variations of

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

but none have worked. All I get is csv data with objects names/types and I can't figure out how to make it use only selected properties of each object from json data.

like image 541
Łukasz Avatar asked May 27 '15 14:05

Łukasz


People also ask

What does ConvertFrom-JSON do?

The ConvertFrom-Json cmdlet converts a JavaScript Object Notation (JSON) formatted string to a custom PSCustomObject object that has a property for each field in the JSON string. JSON is commonly used by web sites to provide a textual representation of objects.

How do I parse JSON data in PowerShell?

PowerShell makes it easy to modify JSON by converting JSON to a PSCustomObject. The object can then be modified easily like any other object. The object can then be exported back out using ConvertTo-Json. Now if we're on a computer without PowerShell 7.1 we try to run the same command in PowerShell 5.1 but it fails!

How do I extract PowerShell results from CSV?

Getting output in a CSV file using PowerShell To get the output of any command in a CSV file, the Export-CSV cmdlet is used. It saves the output as comma-separated values. Here, the Export-CSV command will fetch the output of the Data_object and save it as a CSV file at the specified Path.

How do I convert PowerShell to CSV?

You can use the Export-Csv cmdlet to convert objects to CSV strings. Export-CSV is similar to ConvertTo-CSV , except that it saves the CSV strings to a file. The ConvertTo-CSV cmdlet has parameters to specify a delimiter other than a comma or use the current culture as the delimiter.


1 Answers

In short you need to do something like this:

(Get-Content file.json -Raw | ConvertFrom-Json) | Select id,itemName,sellerId | Convertto-CSV -NoTypeInformation

The first problem was that Get-Content was passing individual lines to ConvertFrom-Json which is not what it wants. Using the -Raw switch passes it in its entirety.

The (Get-Content file.json -Raw | ConvertFrom-Json) needs to be in parentheses as that allows us to continue with the pipe. The properties are not accessible without doing this. It looks like it is trying to pass the entire object instead of its individual parts down the pipe.

-NoTypeInformation removes lines like this

#TYPE Selected.System.Management.Automation.PSCustomObject
like image 193
Matt Avatar answered Oct 18 '22 00:10

Matt