如何将类JSON字符串转换为JSON/dict对象?多种方法尝试未果
搞定类JSON字符串转字典+提取目标值的问题
嘿,我来帮你捋清楚这个问题!你遇到的情况大概率是字符串本身藏着小问题(比如隐形转义、多余字符),导致那些常规方法失效,咱们一步步来解决:
第一步:先搞清楚字符串的真实面目
有时候看起来是标准JSON,但实际复制/传输时多了隐形转义字符或者不可见符号,先打印字符串的repr形式,看看它的真实样子:
your_str = '{"key1":"value1","key2":[{"key2.1":"value2.1"},{"key2.2":"value2.2"}]}' print(repr(your_str))
如果输出里出现\\(比如\"key1\"),说明有多余转义,先把它处理掉:cleaned_str = your_str.replace('\\', '')
第二步:用正确姿势转成字典
方法1:修复后用json.loads
如果清理后还是报错,试试先过滤不可见字符,再解析:
import json import re # 过滤掉所有不可见控制字符 cleaned_str = re.sub(r'[\x00-\x1f\x7f]', '', your_str) try: data_dict = json.loads(cleaned_str) print(f"转成字典成功!类型是:{type(data_dict)}") except json.JSONDecodeError as e: print(f"解析失败,错误位置在第{e.pos}位,原因:{e.msg}")
报错信息能帮你定位问题,比如是不是有中文引号、多余逗号之类的。
方法2:用ast.literal_eval试手
这个方法比json.loads更宽松,支持Python字面量语法,你的示例字符串是合法的,直接试:
import ast try: data_dict = ast.literal_eval(your_str) except SyntaxError as e: print(f"语法错误:{e}")
要是还失败,那肯定是你的原始字符串有问题——别乱加['或'],保持原始结构!比如如果字符串前后多了单引号,先去掉:your_str = your_str.strip("'")
第三步:提取所有以value开头的值
转成字典后,写个递归遍历的函数就能把所有目标值捞出来:
def get_value_started_items(data): results = [] if isinstance(data, dict): # 遍历字典的所有值 for val in data.values(): results.extend(get_value_started_items(val)) elif isinstance(data, list): # 遍历列表的每个元素 for item in data: results.extend(get_value_started_items(item)) elif isinstance(data, str) and data.startswith('value'): # 符合条件的字符串就加入结果 results.append(data) return results # 调用函数 print(get_value_started_items(data_dict)) # 输出应该是:['value1', 'value2.1', 'value2.2']
最后排查几个常见坑
- 检查字符串有没有用中文引号(比如
“key1”),要换成英文引号:your_str = your_str.replace('“', '"').replace('”', '"') - 确认字符串前后没有多余的空格或引号,比如开头结尾多了
'或",用strip()去掉
内容的提问来源于stack exchange,提问作者w13rfed
相关产品推荐
相关产品推荐

