如何在Python中从不完整/冗余JSON字符串提取指定字段值?
从不完整/冗余JSON字符串中提取指定键值的Python方案
针对不完整或包含冗余片段的JSON字符串,提取指定键(如MESSAGE_SIZE)对应值的需求,这里提供两种实用方案:
方案一:正则表达式(推荐,适合单键提取)
直接通过正则匹配目标键的键值对,无需解析整个JSON结构,高效且不受JSON完整性影响。
import re def get_message_size(raw_str): # 匹配键"MESSAGE_SIZE"对应的数字值(支持带引号或不带引号的格式) pattern = re.compile(r'"MESSAGE_SIZE"\s*:\s*"?(\d+)"?') match_result = pattern.search(raw_str) if match_result: return int(match_result.group(1)) return None # 测试用例 incomplete_msg = '{"MESSAGE": {"MESSAGE_SIZE": "2230", "IMAGE_NUM' redundant_msg = '{"MESSAGE": {"MESSAGE_SIZE": "2230", "IMAGE_NUMBER": "16227"}}{"MESSA' print(get_message_size(incomplete_msg)) # 输出:2230 print(get_message_size(redundant_msg)) # 输出:2230
优势:
- 代码极简,无需依赖第三方库
- 完全忽略JSON的完整性、冗余结构,只聚焦目标键值
- 支持键值对在JSON中的任意位置
方案二:容错JSON解析(适合需完整解析结构的场景)
如果需要同时提取其他字段,可借助Python标准库或第三方库的容错解析能力,搭配递归查找键值。
方法1:使用标准库json.JSONDecoder.raw_decode
该方法可从字符串开头解析出一个完整的JSON对象,自动忽略后续冗余片段;若遇到不完整JSON则触发异常,此时用正则兜底。
import json def extract_via_raw_decode(raw_str): decoder = json.JSONDecoder() try: parsed_obj, _ = decoder.raw_decode(raw_str) # 递归遍历字典查找目标键 def recursive_find(obj, target_key): if isinstance(obj, dict): if target_key in obj: return int(obj[target_key]) for val in obj.values(): result = recursive_find(val, target_key) if result is not None: return result return None return recursive_find(parsed_obj, "MESSAGE_SIZE") except json.JSONDecodeError: # 解析失败时用正则兜底 return get_message_size(raw_str) # 测试 print(extract_via_raw_decode(redundant_msg)) # 输出:2230 print(extract_via_raw_decode(incomplete_msg)) # 输出:2230
方法2:使用第三方库demjson
demjson支持解析不完整、格式不严格的JSON字符串,需先安装:pip install demjson
import demjson def extract_via_demjson(raw_str): try: # strict=False关闭严格模式,允许解析不完整JSON parsed_obj = demjson.decode(raw_str, strict=False) def recursive_find(obj, target_key): if isinstance(obj, dict): if target_key in obj: return int(obj[target_key]) for val in obj.values(): result = recursive_find(val, target_key) if result is not None: return result return None return recursive_find(parsed_obj, "MESSAGE_SIZE") except: return get_message_size(raw_str) # 测试 print(extract_via_demjson(incomplete_msg)) # 输出:2230 print(extract_via_demjson(redundant_msg)) # 输出:2230
方案选择建议
- 仅需提取单个固定键:优先使用正则表达式,代码简洁高效
- 需要解析整个JSON结构:根据场景选择
raw_decode(处理冗余)或demjson(处理不完整),同时搭配正则兜底提升鲁棒性
内容的提问来源于stack exchange,提问作者phhoffmann
相关产品推荐
相关产品推荐

