SOLVED

Convert Json With Nested Arrays to CSV

%3CLINGO-SUB%20id%3D%22lingo-sub-3278009%22%20slang%3D%22en-US%22%3EConvert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3278009%22%20slang%3D%22en-US%22%3E%3CP%3EWe%20are%20trying%20to%20get%20data%20that%20is%20exported%20through%20an%20API%20converted%20to%20a%20CSV.%20Each%20%22columns%22%20array%20is%20the%20data%20we%20need%2C%20and%20ALL%20the%20%22columns%22%20arrays%20are%20nested%20in%20a%20single%20%22rows%22%20array.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ETo%20give%20you%20the%20entire%20workflow%2C%20we%20call%20for%20the%20API%2C%20the%20JSON%20output%20is%20saved%20to%20a%20JSON%20file.%20That%20file%20is%20then%20recalled%20to%20process%20the%20CSV%20export.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHere%20is%20a%20code%20sample.%20Keep%20in%20mind%20that%20this%20is%20just%20one%20%22columns%22%20worth%20of%20data%2C%20and%20we%20can%20expect%20there%20to%20be%20~1000%20%22columns%22%20arrays.%20The%20%22name%22%20represents%20the%20headers%20and%20%22value%22%20represents%20the%20data%2C%20and%20each%20%22columns%22%20array%20should%20be%20a%20new%20row.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-json%22%3E%3CCODE%3E%22rows%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22columns%22%3A%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22student_user_id%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%20%22123456%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_firstname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_lastname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phonetype%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phone%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_sortorder%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ESome%20other%20details%20that%20might%20be%20relevant%3A%20%22name%20is%20the%20column%20header.%20%22student_user_id%22%20will%20always%20be%20populated%20with%20a%20%22value%22%20however%20not%20all%20%22name%22%20headers%20will%20have%20a%20%22value%22.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%20for%20the%20input!%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-3278009%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EWindows%20PowerShell%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3285799%22%20slang%3D%22en-US%22%3ERe%3A%20Convert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3285799%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F314983%22%20target%3D%22_blank%22%3E%40LainRobertson%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI%20truly%20appreciate%20you%20taking%20the%20time%20to%20explain%20your%20work.%20It%20has%20helped%20tremendously!%20I%20was%20able%20to%20export%20a%20CSV%20by%20assigning%20your%20script%20to%20an%20%24output%20object%20and%20defining%20that%20in%20the%20export%20parameters.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%20again%20for%20your%20help!%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3284489%22%20slang%3D%22en-US%22%3ERe%3A%20Convert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3284489%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F1355505%22%20target%3D%22_blank%22%3E%40MikeRD%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EIt's%20pretty%20much%20in%20line%20with%20what%20I%20had%20above.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHere's%20a%20more%20complete%2C%20yet%20still%20basic%20script.%20I%20simply%20named%20this%20Get-StudentsFromJson.ps1%20so%20I%20could%20provide%20some%20use%20examples%20below%20but%20you%20can%20call%20it%20what%20you%20like.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CSTRONG%3EUse%20example%201%3C%2FSTRONG%3E%3A%20Providing%20the%20path%20to%20a%20properly-formatted%20JSON%20file.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E.%5CGet-StudentsFromJson.ps1%20-Path%20.%5Cjson1.txt%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CSTRONG%3EUse%20example%202%3C%2FSTRONG%3E%3A%20Piping%20in%20the%20text.%3C%2FP%3E%3CP%3EHere%2C%20I'm%20taking%20it%20from%20a%20file%20but%20it%20could%20just%20as%20easily%20come%20from%20any%20command%20that%20returns%20peoperly-formatted%20JSON%2C%20such%20as%20Invoke-Method.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3EGet-Content%20-Path%20.%5Cjson.txt%20-Raw%20%7C%20.%5CGet-StudentsFromJson.ps1%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20script%20itself%20(again%2C%20this%20is%20nothing%20fancy%20and%20I'm%20stopping%20at%20converting%20it%20to%20object%20notation%20as%20I%20fully%20expect%20you%20know%20how%20to%20then%20further%20convert%20it%20to%20CSV%20or%20whatever%20else%20you'd%20like%20to%20do%20with%20the%20object(s).)%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%5Bcmdletbinding(DefaultParameterSetName%3D%22ByPath%22)%5D%0Aparam(%0A%20%20%20%20%5Bparameter(Mandatory%3D%24true%2C%20ParameterSetName%3D%22ByPath%22)%5D%5BValidateNotNullOrEmpty()%5D%5Bstring%5D%20%24Path%0A%20%20%20%20%2C%20%5Bparameter(Mandatory%3D%24true%2C%20ParameterSetName%3D%22ByPipe%22%2C%20ValueFromPipeline%3D%24true%2C%20Position%3D0)%5D%5BValidateNotNullOrEmpty()%5D%5Bstring%5B%5D%5D%20%24RawText%0A)%0A%0A%23%20If%20ByPath%20is%20the%20entry%20point%2C%20check%20that%20the%20specified%20file%20actually%20exists.%0Aif%20(%24Path)%0A%7B%0A%20%20%20%20if%20(Test-Path%20-Path%20%24Path)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20(Get-Content%20-Path%20%24Path%20-Raw%20%7C%20ConvertFrom-Json).results.rows%20%7C%20ForEach-Object%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ht%20%3D%20%5BSystem.Collections.Hashtable%5D%3A%3Anew()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24_.columns%20%7C%20ForEach-Object%20%7B%20%24ht.Add(%24_.name%2C%20%24_.value)%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BPSCustomObject%5D%24ht%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20throw%20%5BSystem.IO.FileNotFoundException%5D%3A%3Anew()%3B%0A%20%20%20%20%7D%0A%0A%7D%0Aelse%0A%7B%0A%20%20%20%20(%24RawText%20%7C%20ConvertFrom-Json).results.rows%20%7C%20ForEach-Object%20%7B%0A%20%20%20%20%20%20%20%20%24ht%20%3D%20%5BSystem.Collections.Hashtable%5D%3A%3Anew()%3B%0A%20%20%20%20%20%20%20%20%24_.columns%20%7C%20ForEach-Object%20%7B%20%24ht.Add(%24_.name%2C%20%24_.value)%3B%20%7D%0A%20%20%20%20%20%20%20%20%5BPSCustomObject%5D%24ht%3B%0A%20%20%20%20%7D%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EIt's%20worth%20noting%20I've%20tried%20to%20chain%20pipes%20together%20as%20much%20as%20possible%20to%20promote%20early%20object%20release.%20You%20can%20store%20conversions%20in%20things%20like%20variables%20but%20that%20can%20manifest%20as%20memory%20issues%20where%20very%20large%20input%20sources%20are%20used.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThat's%20not%20relevant%20where%20you're%20only%20talking%20about%20500%20-%20or%20even%20thousands%20-%20of%20rows%2C%20but%20if%20you%20get%20into%20the%20hundreds%20of%20thousands%2C%20it's%20a%20different%20story.%20Anyway%2C%20I%20digress.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CSTRONG%3ENote%3C%2FSTRONG%3E%3C%2FP%3E%3CP%3EWith%20your%20JSON%20example%2C%20it's%20missing%20the%20outer%20prefixed%20%22%7B%22%20and%20closing%20%22%7D%22%2C%20which%20in%20turn%20causes%20ConvertFrom-Json%20to%20throw%20a%20hissy-fit.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EIf%20you%20add%20that%20in%20to%20get%20a%20properly%20formatted%20response%20then%20you%20get%20this%20as%20example%20output.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markdown%22%3E%3CCODE%3Eec_phonetype%20%20%20%20%3A%0Aec_lastname%20%20%20%20%20%3A%0Aec_phone%20%20%20%20%20%20%20%20%3A%0Aec_sortorder%20%20%20%20%3A%0Aec_firstname%20%20%20%20%3A%0Astudent_user_id%20%3A%201234%0A%0Aec_phonetype%20%20%20%20%3A%0Aec_lastname%20%20%20%20%20%3A%0Aec_phone%20%20%20%20%20%20%20%20%3A%0Aec_sortorder%20%20%20%20%3A%0Aec_firstname%20%20%20%20%3A%0Astudent_user_id%20%3A%205678%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ECheers%2C%3C%2FP%3E%3CP%3ELain%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3284389%22%20slang%3D%22en-US%22%3ERe%3A%20Convert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3284389%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F314983%22%20target%3D%22_blank%22%3E%40LainRobertson%3C%2FA%3E%26nbsp%3BThanks!%20This%20certainly%20did%20help.%20However%20getting%20this%20into%20production%20has%20some%20other%20issues.%26nbsp%3B%20have%20tried%20the%20last%20few%20days%20to%20come%20up%20with%20a%20solution%2C%20but%20am%20not%20successful.%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20issue%20is%2C%20the%20file%20we%20want%20to%20convert%20actually%20has%20around%20500%20of%20the%20nested%20arrays.%20From%20what%20I%20understand%20about%20hashtables%2C%20you%20cant%20have%20duplicate%20keys.%20I%20have%20tried%20to%20loop%20the%20hash%20to%20object%20portion%20of%20the%20script%2C%20but%20has%20not%20been%20successful.%20Here%20is%20a%20sample%3A%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-json%22%3E%3CCODE%3E%20%22results%22%3A%20%20%7B%0A%20%20%20%20%20%20%20%20%22rows%22%3A%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22columns%22%3A%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22student_user_id%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%20%221234%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_firstname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_lastname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phonetype%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phone%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_sortorder%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22columns%22%3A%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22student_user_id%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%20%225678%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_firstname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_lastname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phonetype%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phone%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_sortorder%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EWith%20all%20the%20resource%20I%20found%2C%20I%20either%20got%20errors%20or%20it%20returns%20a%20blank%20object.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3281489%22%20slang%3D%22en-US%22%3ERe%3A%20Convert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3281489%22%20slang%3D%22en-US%22%3E%3CP%3Echange%20the%20last%20line%20to%20accomplish%20the%20CSV%20output%20you%20mentioned%20in%20your%20original%20post.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-applescript%22%3E%3CCODE%3E%5BPSCustomObject%5D%24ht%20%7C%20ConvertTo-Csv%20-NoTypeInformation%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20output%20should%20look%20like%20this%3A%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CTABLE%20border%3D%221%22%20width%3D%22100%25%22%3E%3CTBODY%3E%3CTR%3E%3CTD%20width%3D%22100%25%22%3E%22ec_phonetype%22%2C%22ec_lastname%22%2C%22ec_phone%22%2C%22ec_sortorder%22%2C%22ec_firstname%22%2C%22student_user_id%22%3CBR%20%2F%3E%2C%2C%2C%2C%2C%22123456%22%3C%2FTD%3E%3C%2FTR%3E%3C%2FTBODY%3E%3C%2FTABLE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F314983%22%20target%3D%22_blank%22%3E%40LainRobertson%3C%2FA%3E%3C%2FP%3E%3CP%3EGreat%20job%20with%20your%20conversion%20process.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThanks%2C%3C%2FP%3E%3CP%3Etumtum%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3278688%22%20slang%3D%22en-US%22%3ERe%3A%20Convert%20Json%20With%20Nested%20Arrays%20to%20CSV%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3278688%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F1355505%22%20target%3D%22_blank%22%3E%40MikeRD%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHere's%20a%20sample%20based%20on%20only%20caring%20about%20the%20contents%20of%20the%20%22columns%22%20array%20rather%20than%20the%20parent%20JSON%20structures.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EHopefully%20this%20gives%20you%20some%20ideas%20on%20how%20to%20get%20what's%20effectively%20a%20hash%20table%20into%20object%20notation.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%24jsontext%20%3D%20'%0A%7B%0A%20%20%20%20%22rows%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22columns%22%3A%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22student_user_id%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%20%22123456%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_firstname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_lastname%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phonetype%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_phone%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%20%22ec_sortorder%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%0A%7D%0A'%3B%0A%0A%24json%20%3D%20ConvertFrom-Json%20-InputObject%20%24jsontext%3B%0A%24ht%20%3D%20%5BSystem.Collections.Hashtable%5D%3A%3Anew()%3B%0A%24json.rows.columns%20%7C%20ForEach-Object%20%7B%20%24ht.Add(%24_.name%2C%20%24_.value)%3B%20%7D%0A%5BPSCustomObject%5D%24ht%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EThe%20output%20produced%20from%20using%20your%20sample%20looks%20like%20this%20(Format-List%20presentation.)%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%3Eec_phonetype%20%3A%3CBR%20%2F%3Eec_lastname%20%3A%3CBR%20%2F%3Eec_phone%20%3A%3CBR%20%2F%3Eec_sortorder%20%3A%3CBR%20%2F%3Eec_firstname%20%3A%3CBR%20%2F%3Estudent_user_id%20%3A%20123456%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ECheers%2C%3C%2FP%3E%3CP%3ELain%3C%2FP%3E%3C%2FLINGO-BODY%3E
New Contributor

We are trying to get data that is exported through an API converted to a CSV. Each "columns" array is the data we need, and ALL the "columns" arrays are nested in a single "rows" array.

 

To give you the entire workflow, we call for the API, the JSON output is saved to a JSON file. That file is then recalled to process the CSV export.

 

Here is a code sample. Keep in mind that this is just one "columns" worth of data, and we can expect there to be ~1000 "columns" arrays. The "name" represents the headers and "value" represents the data, and each "columns" array should be a new row.

 

 

"rows": [
            {
                "columns":  [
                                {
                                "name":  "student_user_id",
                                "value":  "123456"
                                },
                                {
                                "name":  "ec_firstname"
                                },
                                {
                                "name":  "ec_lastname"
                                },
                                {
                                "name":  "ec_phonetype"
                                },
                                {
                                "name":  "ec_phone"
                                },
                                {
                                "name":  "ec_sortorder"
                                }
                            ]
            }
        ]

 

 

Some other details that might be relevant: "name is the column header. "student_user_id" will always be populated with a "value" however not all "name" headers will have a "value".

 

Thanks for the input!

5 Replies

@MikeRD 

 

Here's a sample based on only caring about the contents of the "columns" array rather than the parent JSON structures.

 

Hopefully this gives you some ideas on how to get what's effectively a hash table into object notation.

 

$jsontext = '
{
    "rows": [
            {
                "columns":  [
                                {
                                "name":  "student_user_id",
                                "value":  "123456"
                                },
                                {
                                "name":  "ec_firstname"
                                },
                                {
                                "name":  "ec_lastname"
                                },
                                {
                                "name":  "ec_phonetype"
                                },
                                {
                                "name":  "ec_phone"
                                },
                                {
                                "name":  "ec_sortorder"
                                }
                            ]
            }
        ]
}
';

$json = ConvertFrom-Json -InputObject $jsontext;
$ht = [System.Collections.Hashtable]::new();
$json.rows.columns | ForEach-Object { $ht.Add($_.name, $_.value); }
[PSCustomObject]$ht;

 

The output produced from using your sample looks like this (Format-List presentation.)

 

ec_phonetype :
ec_lastname :
ec_phone :
ec_sortorder :
ec_firstname :
student_user_id : 123456

 

Cheers,

Lain

change the last line to accomplish the CSV output you mentioned in your original post.

 

 

[PSCustomObject]$ht | ConvertTo-Csv -NoTypeInformation

 

 

 

 

The output should look like this:

 

"ec_phonetype","ec_lastname","ec_phone","ec_sortorder","ec_firstname","student_user_id"
,,,,,"123456"

 

@LainRobertson

Great job with your conversion process.

 

Thanks,

tumtum

 

 

@LainRobertson Thanks! This certainly did help. However getting this into production has some other issues.  have tried the last few days to come up with a solution, but am not successful. 

 

The issue is, the file we want to convert actually has around 500 of the nested arrays. From what I understand about hashtables, you cant have duplicate keys. I have tried to loop the hash to object portion of the script, but has not been successful. Here is a sample:

 

 "results":  {
        "rows":  [
                     {
                         "columns":  [
                                         {
                                             "name":  "student_user_id",
                                             "value":  "1234"
                                         },
                                         {
                                             "name":  "ec_firstname"
                                         },
                                         {
                                             "name":  "ec_lastname"
                                         },
                                         {
                                             "name":  "ec_phonetype"
                                         },
                                         {
                                             "name":  "ec_phone"
                                         },
                                         {
                                             "name":  "ec_sortorder"
                                         }
                                     ]
                     },
                     {
                         "columns":  [
                                         {
                                             "name":  "student_user_id",
                                             "value":  "5678"
                                         },
                                         {
                                             "name":  "ec_firstname"
                                         },
                                         {
                                             "name":  "ec_lastname"
                                         },
                                         {
                                             "name":  "ec_phonetype"
                                         },
                                         {
                                             "name":  "ec_phone"
                                         },
                                         {
                                             "name":  "ec_sortorder"
                                         }
                                     ]
                     }
                ]
            }

 

With all the resource I found, I either got errors or it returns a blank object.

best response confirmed by MikeRD (New Contributor)
Solution

@MikeRD 

 

It's pretty much in line with what I had above.

 

Here's a more complete, yet still basic script. I simply named this Get-StudentsFromJson.ps1 so I could provide some use examples below but you can call it what you like.

 

Use example 1: Providing the path to a properly-formatted JSON file.

 

 

.\Get-StudentsFromJson.ps1 -Path .\json1.txt

 

 

 

Use example 2: Piping in the text.

Here, I'm taking it from a file but it could just as easily come from any command that returns peoperly-formatted JSON, such as Invoke-Method.

 

 

Get-Content -Path .\json.txt -Raw | .\Get-StudentsFromJson.ps1

 

 

 

The script itself (again, this is nothing fancy and I'm stopping at converting it to object notation as I fully expect you know how to then further convert it to CSV or whatever else you'd like to do with the object(s).)

 

 

 

[cmdletbinding(DefaultParameterSetName="ByPath")]
param(
    [parameter(Mandatory=$true, ParameterSetName="ByPath")][ValidateNotNullOrEmpty()][string] $Path
    , [parameter(Mandatory=$true, ParameterSetName="ByPipe", ValueFromPipeline=$true, Position=0)][ValidateNotNullOrEmpty()][string[]] $RawText
)

# If ByPath is the entry point, check that the specified file actually exists.
if ($Path)
{
    if (Test-Path -Path $Path)
    {
        (Get-Content -Path $Path -Raw | ConvertFrom-Json).results.rows | ForEach-Object {
            $ht = [System.Collections.Hashtable]::new();
            $_.columns | ForEach-Object { $ht.Add($_.name, $_.value); }
            [PSCustomObject]$ht;
        };
    }
    else
    {
        throw [System.IO.FileNotFoundException]::new();
    }

}
else
{
    ($RawText | ConvertFrom-Json).results.rows | ForEach-Object {
        $ht = [System.Collections.Hashtable]::new();
        $_.columns | ForEach-Object { $ht.Add($_.name, $_.value); }
        [PSCustomObject]$ht;
    };
}

 

 

 

It's worth noting I've tried to chain pipes together as much as possible to promote early object release. You can store conversions in things like variables but that can manifest as memory issues where very large input sources are used.

 

That's not relevant where you're only talking about 500 - or even thousands - of rows, but if you get into the hundreds of thousands, it's a different story. Anyway, I digress.

 

Note

With your JSON example, it's missing the outer prefixed "{" and closing "}", which in turn causes ConvertFrom-Json to throw a hissy-fit.

 

If you add that in to get a properly formatted response then you get this as example output.

 

 

 

ec_phonetype    :
ec_lastname     :
ec_phone        :
ec_sortorder    :
ec_firstname    :
student_user_id : 1234

ec_phonetype    :
ec_lastname     :
ec_phone        :
ec_sortorder    :
ec_firstname    :
student_user_id : 5678

 

 

 

Cheers,

Lain

@LainRobertson 

 

I truly appreciate you taking the time to explain your work. It has helped tremendously! I was able to export a CSV by assigning your script to an $output object and defining that in the export parameters.

 

Thanks again for your help!