Python:将非标准格式字符串转为字典失败求助
问题描述
我有一段Python字符串格式如下:
'{NODE: {NODE_NAME:TEST_A,NODE_IDE:TEST_A_NODE},{QUEUE : {QUEUE_NAME:TEST_QUEUE,QUEUE_TYPE_CD:1}}'
需要将其转换为字典以获取Node和Queue相关值,但尝试eval、ast.literal_eval和json.loads均失败。
使用json.loads的错误
执行代码:
>>> a='{NODE: {NODE_NAME:TEST_A,NODE_IDE:TEST_A_NODE},{QUEUE : {QUEUE_NAME:TEST_QUEUE,QUEUE_TYPE_CD:1}}' >>> json.loads(a)
报错信息:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads return _default_decoder.decode(s) File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib64/python3.6/json/decoder.py", line 355, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
手动添加双引号后仍报错
执行代码:
>>> a = re.sub(r':\s?(?![{\[\s])([^,}]+)', r': "\1"', a) >>> a = re.sub(r'(\w+):', r'"\1":', a) >>> a '{"NODE": {"NODE_NAME": "TEST_A","NODE_IDE": "TEST_A_NODE"},{"QUEUE":{"QUEUE_NAME": "TEST_QUEUE","QUEUE_TYPE_CD": "1"}}' >>> json.loads(a)
报错信息:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads return _default_decoder.decode(s) File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib64/python3.6/json/decoder.py", line 355, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 60 (char 59)
使用ast.literal_eval的错误
执行代码:
>>> ast.literal_eval(a)
报错信息:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python3.6/ast.py", line 48, in literal_eval node_or_string = parse(node_or_string, mode='eval') File "/usr/lib64/python3.6/ast.py", line 35, in parse return compile(source, filename, mode, PyCF_ONLY_AST) File "<unknown>", line 1 {"NODE": {"NODE_NAME": "TEST_A","NODE_IDE": "TEST_A_NODE"},{"QUEUE":{"QUEUE_NAME": "TEST_QUEUE","QUEUE_TYPE_CD": "1"}} ^ SyntaxError: invalid syntax
解决方案
问题根源在于原始字符串的格式既不符合JSON规范,也不是合法的Python字典格式:
- 最外层结构错误:
{key: value, {key: value}}中第二个元素直接是字典,没有对应的键,正确格式应为{NODE: ..., QUEUE: ...}。 - 键和字符串值未加引号:JSON要求键和字符串值必须用双引号;Python字典允许标识符作为键,但结构错误导致解析失败。
修复步骤
方法一:修正后用json.loads
import json import re a = '{NODE: {NODE_NAME:TEST_A,NODE_IDE:TEST_A_NODE},{QUEUE : {QUEUE_NAME:TEST_QUEUE,QUEUE_TYPE_CD:1}}' # 修正结构错误,给QUEUE添加键标识 a = a.replace(',{QUEUE', ', "QUEUE"') # 给所有键加双引号 a = re.sub(r'(\w+):', r'"\1":', a) # 给非字典/数组的数值加双引号 a = re.sub(r':\s?(?![{\[])([^,}]+)', r': "\1"', a) # 解析为JSON字典 result = json.loads(a) print(result)
输出:
{'NODE': {'NODE_NAME': 'TEST_A', 'NODE_IDE': 'TEST_A_NODE'}, 'QUEUE': {'QUEUE_NAME': 'TEST_QUEUE', 'QUEUE_TYPE_CD': '1'}}
方法二:修正后用ast.literal_eval
import ast import re a = '{NODE: {NODE_NAME:TEST_A,NODE_IDE:TEST_A_NODE},{QUEUE : {QUEUE_NAME:TEST_QUEUE,QUEUE_TYPE_CD:1}}' # 修正结构错误 a = a.replace(',{QUEUE', ', QUEUE') # 给字符串值加引号 a = re.sub(r':\s?(?![{\[])([^,}]+)', r': "\1"', a) # 解析为Python字典 result = ast.literal_eval(a) print(result)
输出与方法一一致。
内容的提问来源于stack exchange,提问作者Senthilkumar Duraisamy
相关产品推荐
相关产品推荐

