Adam Sanders
Adam Sanders

Reputation: 39

Parsing JSON file in powershell with specific characters

I am trying to get the values in powershell within specific characters. Basically I have a json with thousands of objects like this

  "Name": "AllZones_APOPreface_GeographyMatch_FromBRE_ToSTR",
  "Sequence": 0,
  "Condition": "this.TripOriginLocationCode==\"BRE\"&&this.TripDestinationLocationCode==\"STR\"",
  "Action": "this.FeesRate=0.19m;this.ZoneCode=\"Zone1\";halt",
  "ElseAction": ""

I want everything within \" \"

IE here I would see that BRE and STR is Zone1

All I need is those 3 things outputted.

I have been searching how to do it with ConvertFrom-Json but no success, maybe I just havent found a good article on this.

Thanks

Upvotes: 0

Views: 553

Answers (1)

user189198
user189198

Reputation:

Start by representing your JSON as a string:

$myjson = @'
{
  "Name": "AllZones_APOPreface_GeographyMatch_FromBRE_ToSTR",
  "Sequence": 0,
  "Condition": "this.TripOriginLocationCode==\"BRE\"&&this.TripDestinationLocationCode==\"STR\"",
  "Action": "this.FeesRate=0.19m;this.ZoneCode=\"Zone1\";halt",
  "ElseAction": ""
}
'@

Next, create a regular expression that matches everything in between \" and \", that's under 10 characters long (else it'll match unwanted results).

$regex = [regex]::new('\\"(?<content>.{1,10})\\"')

Next, perform the regular expression comparison, by calling the Matches() method on the regular expression. Pass your JSON string into the method parameters, as the text that you want to perform the comparison against.

$matchlist = $regex.Matches($myjson)

Finally, grab the content match group that was defined in the regular expression, and extract the values from it.

$matchlist.Groups.Where({ $PSItem.Name -eq 'content' }).Value

Result

BRE
STR
Zone1

Approach #2: Use Regex Look-behinds for more accurate matching

Here's a more specific regular expression that uses look-behinds to validate each field appropriately. Then we assign each match to a developer-friendly variable name.

$regex = [regex]::new('(?<=TripOriginLocationCode==\\")(?<OriginCode>\w+)|(?<=TripDestinationLocationCode==\\")(?<DestinationCode>\w+)|(?<=ZoneCode=\\")(?<ZoneCode>\w+)')
$matchlist = $regex.Matches($myjson)

### Assign each component to its own friendly variable name
$OriginCode, $DestinationCode, $ZoneCode = $matchlist[0].Value, $matchlist[1].Value, $matchlist[2].Value

### Construct a string from the individual components
'Your origin code is {0}, your destination code is {1}, and your zone code is {2}' -f $OriginCode, $DestinationCode, $ZoneCode

Result

Your origin code is BRE, your destination code is STR, and your zone code is Zone1

Upvotes: 1

Related Questions