如何将字符串转换为字典?json.loads解析失败的解决方法
解决字符串转字典/JSON对象的问题
这个坑我踩过!你用json.loads()失败的原因很明确:你的字符串不符合标准JSON格式——JSON严格要求对象的键必须用双引号包裹,字符串值也得是双引号,而你给出的字符串里lat、lng这两个键没有加引号,值用的还是单引号,这直接触发了解析错误。
下面给你两个可行的解决办法:
方法1:正则修正格式后用json.loads()解析
先通过正则给无引号的键加上双引号,再把单引号替换成双引号,让字符串符合JSON规范,之后就能正常解析了:
import json import re # 你的原始字符串 coordinates = "{ lat: '55,7303650017903', lng: '12,3446636123658' }" # 步骤1:给没有引号的键添加双引号 fixed_json_str = re.sub(r'(\w+):', r'"\1":', coordinates) # 步骤2:把单引号替换为双引号 fixed_json_str = fixed_json_str.replace("'", '"') # 现在可以正常解析成JSON对象(Python字典) parsed_coords = json.loads(fixed_json_str) print(parsed_coords) # 输出结果:{'lat': '55,7303650017903', 'lng': '12,3446636123658'}
正则说明
(\w+):会匹配所有类似lat:、lng:的键名部分,\1引用匹配到的键名,替换成"lat":这种带双引号的格式,完美解决JSON键的格式要求。
方法2:用ast.literal_eval解析(更适配Python语法)
如果你更习惯Python的字典语法,也可以用ast.literal_eval——它能解析符合Python字面量规则的字符串,不过同样需要先给键加上引号(Python字典的字符串键必须加引号):
import ast import re coordinates = "{ lat: '55,7303650017903', lng: '12,3446636123658' }" # 给键加上单引号,适配Python字典格式 fixed_py_str = re.sub(r'(\w+):', r"'\1':", coordinates) # 解析为Python字典 parsed_coords = ast.literal_eval(fixed_py_str) print(parsed_coords) # 输出结果:{'lat': '55,7303650017903', 'lng': '12,3446636123658'}
ast.literal_eval比json.loads更灵活,但只适合解析Python原生类型的字面量,安全性也更高(不会执行恶意代码)。
额外补充:处理数值里的逗号
注意到你数值里用的是逗号(比如55,730365...),如果这是小数点的笔误,你可以在解析后替换并转成数值类型:
# 把逗号替换成小数点并转成浮点数 parsed_coords['lat'] = float(parsed_coords['lat'].replace(',', '.')) parsed_coords['lng'] = float(parsed_coords['lng'].replace(',', '.')) print(parsed_coords) # 输出结果:{'lat': 55.7303650017903, 'lng': 12.3446636123658}
内容的提问来源于stack exchange,提问作者Derrick Omanwa
相关产品推荐
相关产品推荐

