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

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字典格式:

  1. 最外层结构错误:{key: value, {key: value}}中第二个元素直接是字典,没有对应的键,正确格式应为{NODE: ..., QUEUE: ...}。
  2. 键和字符串值未加引号: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:55:22