使用特定字符解析PowerShell中的JSON文件

时间:2018-05-10 22:55:29

标签: json powershell parsing

我试图在powershell中获取特定字符中的值。基本上我有一个像这样的数千个对象的json

  "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": ""

我想要一切都在\" \"

IE在这里我会看到BRE和STR是Zone1

我所需要的只是输出的3件事。

我一直在寻找如何使用ConvertFrom-Json做到但没有成功,也许我还没有找到一篇关于此的好文章。

由于

1 个答案:

答案 0 :(得分:1)

首先将JSON表示为字符串:

$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": ""
}
'@

接下来,创建一个正则表达式,该表达式匹配\"\"之间的所有内容,长度不超过10个字符(否则它会匹配不需要的结果)。

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

接下来,通过在正则表达式上调用Matches()方法来执行正则表达式比较。将您的JSON字符串传递给方法参数,作为要执行比较的文本。

$matchlist = $regex.Matches($myjson)

最后,抓住正则表达式中定义的content匹配组,并从中提取值。

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

结果

BRE
STR
Zone1

方法#2:使用Regex Look-behinds进行更准确的匹配

这是一个更具体的正则表达式,它使用后视来适当地验证每个字段。然后我们将每个匹配分配给开发人员友好的变量名称。

$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

结果

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