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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:25:29