You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Regex提取嵌套JSON中的devSummaryJson内容

问题描述

我有如下嵌套JSON内容:

{"expand": "names,schema","startAt": 0,"maxResults": 50,"total": 1,"issues": [{"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields","id": "641955","self": "https://rb-tracker.bosch.com/tracker19/rest/api/latest/issue/641955","key": "EDATOOL-1411","fields": {"created": "2022-12-06T11:14:36.000+0100","customfield_10000": "{summaryBean=com.atlassian.jira.plugin.devstatus.rest.SummaryBean@24a1688f[summary={pullrequest=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@23f2f23c[overall=PullRequestOverallBean{stateCount=0, state='OPEN', details=PullRequestOverallDetails{openCount=0, mergedCount=0, declinedCount=0}},byInstanceType={}], build=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@321de5ab[overall=com.atlassian.jira.plugin.devstatus.summary.beans.BuildOverallBean@6ca82c6[failedBuildCount=0,successfulBuildCount=0,unknownBuildCount=0,count=0,lastUpdated=<null>,lastUpdatedTimestamp=<null>],byInstanceType={}], review=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@5fc3e1e6[overall=com.atlassian.jira.plugin.devstatus.summary.beans.ReviewsOverallBean@7a2d42e3[stateCount=0,state=<null>,dueDate=<null>,overDue=false,count=0,lastUpdated=<null>,lastUpdatedTimestamp=<null>],byInstanceType={}], deployment-environment=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@2740d0b0[overall=com.atlassian.jira.plugin.devstatus.summary.beans.DeploymentOverallBean@75ceaa2c[topEnvironments=[],showProjects=false,successfulCount=0,count=0,lastUpdated=<null>,lastUpdatedTimestamp=<null>],byInstanceType={}], repository=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@35c2a9a2[overall=com.atlassian.jira.plugin.devstatus.summary.beans.CommitOverallBean@2568cfa3[count=0,lastUpdated=<null>,lastUpdatedTimestamp=<null>],byInstanceType={}], branch=com.atlassian.jira.plugin.devstatus.rest.SummaryItemBean@40c4eee[overall=com.atlassian.jira.plugin.devstatus.summary.beans.BranchOverallBean@4131b89[count=0,lastUpdated=<null>,lastUpdatedTimestamp=<null>],byInstanceType={}]},errors=[],configErrors=[]], devSummaryJson={\"cachedValue\":{\"errors\":[],\"configErrors\":[],\"summary\":{\"pullrequest\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"stateCount\":0,\"state\":\"OPEN\",\"details\":{\"openCount\":0,\"mergedCount\":0,\"declinedCount\":0,\"total\":0},\"open\":true},\"byInstanceType\":{}},\"build\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"failedBuildCount\":0,\"successfulBuildCount\":0,\"unknownBuildCount\":0},\"byInstanceType\":{}},\"review\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"stateCount\":0,\"state\":null,\"dueDate\":null,\"overDue\":false,\"completed\":false},\"byInstanceType\":{}},\"deployment-environment\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"topEnvironments\":[],\"showProjects\":false,\"successfulCount\":0},\"byInstanceType\":{}},\"repository\":{\"overall\":{\"count\":0,\"lastUpdated\":null},\"byInstanceType\":{}},\"branch\":{\"overall\":{\"count\":0,\"lastUpdated\":null},\"byInstanceType\":{}}}},\"isStale\":true}}}]}

我希望用正则提取devSummaryJson={}块内的内容,尝试使用正则表达式devSummaryJson={.*时,返回结果包含多余字符:

devSummaryJson={\"cachedValue\":{\"errors\":[],\"configErrors\":[],\"summary\":{\"pullrequest\":{\"overall\":{\"count\":1,\"lastUpdated\":\"2022-12-19T09:09:46.366+0100\",\"stateCount\":1,\"state\":\"MERGED\",\"details\":{\"openCount\":0,\"mergedCount\":1,\"declinedCount\":2,\"total\":3},\"open\":false},\"byInstanceType\":{\"stash\":{\"count\":1,\"name\":\"Bitbucket Server\"}}},\"build\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"failedBuildCount\":0,\"successfulBuildCount\":0,\"unknownBuildCount\":0},\"byInstanceType\":{}},\"review\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"stateCount\":0,\"state\":null,\"dueDate\":null,\"overDue\":false,\"completed\":false},\"byInstanceType\":{}},\"deployment-environment\":{\"overall\":{\"count\":0,\"lastUpdated\":null,\"topEnvironments\":[],\"showProjects\":false,\"successfulCount\":0},\"byInstanceType\":{}},\"repository\":{\"overall\":{\"count\":1,\"lastUpdated\":\"2022-12-19T09:09:46.000+0100\"},\"byInstanceType\":{\"stash\":{\"count\":1,\"name\":\"Bitbucket Server\"}}},\"branch\":{\"overall\":{\"count\":0,\"lastUpdated\":null},\"byInstanceType\":{}}}},\"isStale\":false}}}]}

由于后续JSON格式可能变更,不希望通过固定删除末尾字符解决问题,请问有什么可行的解决方案?

解决方案

1. 使用支持平衡组的正则表达式

普通正则的贪婪匹配会匹配到最后一个右大括号,而平衡组可以递归匹配嵌套的大括号,精准定位devSummaryJson后的完整JSON块。

正则表达式示例:

devSummaryJson=(\{(?:[^{}]|(?1))*\})
  • (?1)表示递归匹配第一个捕获组的内容,实现嵌套大括号的匹配
  • 这个正则会精准捕获devSummaryJson=后面从第一个{到对应闭合}的所有内容

Python 代码示例(需使用regex库,而非标准库re):

import regex

raw_content = """你的原始JSON字符串"""
pattern = r'devSummaryJson=(\{(?:[^{}]|(?1))*\})'
match = regex.search(pattern, raw_content)
if match:
    dev_summary_json = match.group(1)
    # 处理转义引号,转为合法JSON
    dev_summary_json = dev_summary_json.replace('\\"', '"')
    print(dev_summary_json)

2. 先解析外层JSON,再处理内部字符串

原始内容是合法JSON,customfield_10000字段的值是一个包含devSummaryJson的字符串,先解析外层JSON可以缩小处理范围,再在目标字符串内提取内容:

Python 代码示例:

import json
import regex

# 解析外层JSON
with open('input.json', 'r') as f:
    data = json.load(f)

# 提取customfield_10000的字符串内容
custom_field = data['issues'][0]['fields']['customfield_10000']

# 用平衡组正则提取devSummaryJson的内容
pattern = r'devSummaryJson=(\{(?:[^{}]|(?1))*\})'
match = regex.search(pattern, custom_field)
if match:
    dev_summary_json = match.group(1).replace('\\"', '"')
    # 进一步解析为JSON对象
    dev_summary_data = json.loads(dev_summary_json)
    print(dev_summary_data)

3. 使用命令行工具(如jq)处理

如果用命令行,可以结合jq提取外层字段,再用正则工具提取目标内容:

# 提取customfield_10000字段,再用grep的Perl正则提取devSummaryJson的内容
jq -r '.issues[0].fields.customfield_10000' input.json | grep -oP 'devSummaryJson=\K\{(?:[^{}]|(?R))*\}'
  • \K用于忽略前面的devSummaryJson=部分
  • (?R)递归匹配当前正则,实现嵌套大括号匹配(需grep支持Perl正则)

内容的提问来源于stack exchange,提问作者Tri Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:55:36