如何从不完整类JSON字符串中提取@nexturl键的完整值
提取不完整类JSON中@nexturl值的实现方案
问题描述
现有一段不完整的类JSON字符串,需要提取最后一个键值对中@nexturl对应的值,待处理字符串如下:
"BaseCode":null,"BrokerSymbol":null,"CustID":null,"SynthDesc":""}],"@nexturl":"https://someurl.com"}
原有实现采用按冒号分割取最后一段的逻辑:
str1.split(":")[-1]
运行后输出//someurl.com,存在两处明显问题:
- 分割逻辑会截断URL的
https前缀,无法拿到完整地址 - 鲁棒性不足,只要URL中包含其他冒号字符就会出现分割错误
可行实现方法
方法1:补全结构后用标准JSON解析(优先推荐,稳定性最高)
观察待处理字符串可发现,其仅缺失最开头的左大括号{,补全后即为完全合法的JSON结构,直接用语言内置的JSON库解析即可,完全不受值内部特殊字符影响:
import json raw_str = '''"BaseCode":null,"BrokerSymbol":null,"CustID":null,"SynthDesc":""}],"@nexturl":"https://someurl.com"}''' # 补全开头缺失的左大括号,生成合法JSON valid_json = '{' + raw_str parsed_data = json.loads(valid_json) next_url = parsed_data["@nexturl"] # 输出结果为 https://someurl.com
如果待处理字符串开头缺失的内容长度不固定,可以先定位"@nexturl"的起始索引,截断该位置之前的无效内容后再补全左大括号,适配更多残缺场景。
方法2:按键名定位做字符串截取(轻量场景适用)
如果不想引入JSON解析逻辑,且确定@nexturl的取值为双引号包裹的字符串,可以直接定位键名位置,截取两个双引号之间的内容,不会受值内部冒号干扰:
raw_str = '''"BaseCode":null,"BrokerSymbol":null,"CustID":null,"SynthDesc":""}],"@nexturl":"https://someurl.com"}''' key_flag = '"@nexturl":"' # 定位值的起始位置 start_idx = raw_str.find(key_flag) + len(key_flag) # 定位值结束的双引号位置 end_idx = raw_str.find('"', start_idx) next_url = raw_str[start_idx:end_idx] # 输出结果为 https://someurl.com
该方法只要键名匹配、值的格式符合双引号包裹的规则,即使值内包含多个冒号、特殊符号也能正确提取。
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

