一、概述
从 word 中提取所有有效 json (包含跨段落的 json)。
二、代码
"""
从 Word 文档中提取所有的 JSON 对象
原理:
1.遇到"{",将"{"存入数组,并开始计数
2.遇到"}",则取出全部字符,如果没有剩余,则是一个完整的 {}
3.判断完整的{}是否是有效的 json
"""
from docx import Document
import json
def extract_json_from_docx(doc_path):
"""从 Word 文档中提取所有的 JSON 对象"""
document = Document(doc_path)
all_text = ""
for para in document.paragraphs:
all_text += para.text.strip()
return extract_json_from_text(all_text)
def extract_json_from_text(all_text):
json_objects = []
stack = []
start_index = 0
for i in range(len(all_text)):
if all_text[i] == "{":
stack.append("{")
if len(stack) == 1: # 当栈中只有一个 "{" 时,记录开始索引
start_index = i
elif all_text[i] == "}":
if stack: # 如果栈不为空
stack.pop()
# print(stack)
if not stack: # 如果弹出后栈为空,表示找到一个完整的 JSON 对象
json_str = all_text[start_index: i + 1]
try:
json_obj = json.loads(json_str)
json_objects.append(json_obj)
print(f"有效 JSON: {json_obj}")
except json.JSONDecodeError:
print(f"无效 JSON: {json_str}")
return json_objects
def remove_outer_braces(text):
"""
单独处理{{}}这种情况
:param text: 包含嵌套 JSON 的文本
:return: 去除了最外层大括号的 JSON 字符串
"""
start_index = text.find('{{')
end_index = text.rfind('}}')
if start_index != -1 and end_index != -1 and start_index < end_index:
return text[start_index + 1:end_index + 1]
else:
return text
if __name__ == "__main__":
# doc_path = "/Users/wangfugui/Downloads/test.docx"
# extract_json_from_docx(doc_path)
text = """aaa
{{
"name": "张三",
"age": 30,
"city": "上海"
}}
"""
print(remove_outer_braces(text))
print('*'*10)
print(extract_json_from_text(remove_outer_braces(text)))