Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Issue with API result not converting to object in powershell

I have an odd problem. I’m getting some data back from an API and storing it in $response

The result looks like this (I’ve changed the names and IDs):

accountId           : 1234
secureScoreProgress : @{startDate=2022-12-12 00:00:00.000; endDate=2023-01-26 00:00:00.000; totalDays=2738; minScore=76; maxScore=534.18; averageScore=257.33; data=System.Object[]}
monitoredAccounts   : @{total=479; data=System.Object[]}
accountIdToNameMap  : @{1234=Apple; 5432=Microsoft; 2584=Tesla; 7533=Ben and Jerry; 7534=Micool Paul Inc; 7549=AGLX; 7558=Samsung}

I’m interested in the ‘accountIdToNameMap’ section, so I store it to an object like so:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

$accounts = $response.accountIdToNameMap

This returns the following list:

1234 : Apple
5432 : Microsoft
2584 : Tesla
7533 : Ben and Jerry
7534 : Micool Paul Inc
7549 : AGLX
7558 : Samsung

If I try to do a foreach on the list, it only loops once and outputs that whole list in one go.

I’ve tried to ConvertFrom-JSON but that throws Invalid JSON primitive: .

I’ve tried to ConvertTo-JSON, which works, but I still can’t loop through the results. After ConvertTo-JSON, the result looks like this:

{
    "1234":  "Apple",
    "5432":  "Microsoft",
    "2584":  "CH Hausmann",
    "7533":  "Hughes Fowler Carruthers",
    "7534":  "Tempest Resourcing",
    "7549":  "Cream UK Ltd",
    "7558":  "Illuminatis / Scout Data"
}

What am I doing wrong?

>Solution :

If I try to do a foreach on the list

It’s not a list, it’s an object. You can enumerate its properties by accessing the hidden psobject member:

foreach ($property in $accounts.psobject.Properties) {
    "The `$accounts object has a property named '$($property.Name)' with value '$($property.Value)'"
}

You can use this to build a hashtable (an unordered dictionary):

$idToNameMap = @{}
foreach ($property in $accounts.psobject.Properties) {
    $idToNameMap[$property.Name] = $property.Value
}

Now you can easily use it as a lookup table:

$idToNameMap['1234'] # resolves to "Apple"
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading