Home > Mobile >  Populate collection of objects from one JSON file to the collection of another one with PowerShell
Populate collection of objects from one JSON file to the collection of another one with PowerShell

Time:12-25

I have two JSON files and want to transfer collection of objects from one file to another. Suppose, the from.json file contains property which represents collection of clients:

"Clients": 
[
  {
    "Name": "Name1",
    "Age": "12"
  },
  {
    "Name": "Name2",
    "Age": "14"
  }
]

to.json file contains an empty collection, "Objects: []" ,which must be filled with objects from from.json. Each objects in toJson variable must contain additional property - Id, so eventually, my "to.json" file should look like this:

"Objects":
[
  {
    "Id": "{new-id}",
    "Name": "Name1",
    "Age": "12"
  },
  {
    "Id": "{new-id}",
    "Name": "Name1",
    "Age": "12"
  }
]

I've converted two files into variables:

$fromJson = (Get-Content -Raw -Path {fromPath}) | ConvertFrom-Json
$toJson = (Get-Content -Raw -Path {toPath}) | ConvertFrom-Json

I know that objects from fromJson to toJson can be transferred in the following manner: toJson.Objects = fromJson.Clients, but that's not enough in my case. I think that it could be done by iterating through fromJson.Clients array but have no idea how to create an object and add it into toJson.Objects collection.

CodePudding user response:

Here's a more efficient solution, based on:

  • Use of a calculated property with Select-Object, which allows you to place the new property first in the output objects.

  • Instead of building the array one by one with = (which is inefficient, because a new array must technically be created behind the scenes in every iteration), the solution below lets PowerShell collect the output objects of the Select-Object call in an array automatically (the [array] type constraint is needed to ensure that an array is created even if only one object happens to be output.)

# Sample input.
$fromJson = ConvertFrom-Json '{"Clients":[{"Name":"Name1","Age":"12"},{"Name":"Name2","Age":"14"}]}'
$toJson = ConvertFrom-Json '{ "Objects": [] }'

[array] $toJson.Objects = 
          $fromJson.Clients |
            Select-Object @{ Name='Id'; Expression = { [string] (New-Guid) } }, * 
 
$toJson | ConvertTo-Json -Depth 3 # append | Set-Content as needed.

CodePudding user response:

Kind of new to the PowerShell, but after a bit of investigation came up with the following solution:

fromJson.Clients | ForEach-Object {
  $_ | Add-Member -MemberType NoteProperty -Name 'Id' -Value ([guid]::NewGuid().Guid.ToString())
  $toJson  = $_
}
...
$toJson | ConvertTo-Json | Out-File {to.json_path}

Frankly, don't know if that is a 'proper' way to do that, but generally it works for that particular case. For now, see no other solution.

  • Related