如何在PowerShell中解析含转义引号的JSON并提取指定值?
解决PowerShell提取JSON中转义引号内容的问题
嘿,我来帮你搞定这个提取需求!你提到用ConvertFrom-Json没成功,大概率是原JSON文件的格式有问题(比如没把所有对象放到数组里,或者存在语法小错误),不过没关系,我给你两种可行的方案:
方案一:先合法解析JSON,再提取目标值
首先得确保你的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": "" }, // 更多对象... ]
之后用以下PowerShell代码解析并提取:
# 读取并解析JSON文件 $jsonData = Get-Content -Path "你的文件路径.json" -Raw | ConvertFrom-Json # 遍历每个对象,提取转义引号内的目标值 foreach ($item in $jsonData) { # 从Condition字段提取出发地和目的地代码 $conditionValues = [regex]::Matches($item.Condition, '(?<=\")([^\"]+)(?=\")') | ForEach-Object { $_.Value } $origin = $conditionValues[0] $destination = $conditionValues[1] # 从Action字段提取ZoneCode值 $zoneCode = [regex]::Match($item.Action, '(?<=ZoneCode=\")([^\"]+)').Value # 输出结构化结果(也可以导出到CSV等) [PSCustomObject]@{ 名称 = $item.Name 出发地 = $origin 目的地 = $destination 区域代码 = $zoneCode } }
这里用到的正则表达式(?<=\")([^\"]+)(?=\")是正向预查匹配,专门抓取被转义双引号包裹的内容,不会把引号本身包含进去。
方案二:直接正则提取(适合JSON格式无法修复的情况)
如果原JSON文件格式太乱,没法用ConvertFrom-Json解析,那可以直接读取文件文本,用正则全局匹配所有转义引号内的内容:
# 读取整个文件内容 $fileContent = Get-Content -Path "你的文件路径.json" -Raw # 匹配所有转义引号内的内容 $allQuotedValues = [regex]::Matches($fileContent, '(?<=\")([^\"]+)(?=\")') | ForEach-Object { $_.Value } # 每3个值为一组(对应每个对象的出发地、目的地、区域代码) for ($i = 0; $i -lt $allQuotedValues.Count; $i += 3) { [PSCustomObject]@{ 出发地 = $allQuotedValues[$i] 目的地 = $allQuotedValues[$i+1] 区域代码 = $allQuotedValues[$i+2] } }
这个方法不需要依赖JSON解析,直接从文本层面提取,适合格式不规范的场景。
内容的提问来源于stack exchange,提问作者Adam Sanders
相关产品推荐
相关产品推荐

