json报错:Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

本文解决了一个常见的编程问题,即在使用Python处理JSON数据时,如何避免将字典中的双引号错误地转换为单引号。通过正确的使用json.dumps()方法而非str(),可以确保数据以正确的JSON格式存储。
部署运行你感兴趣的模型镜像

具体错误如下

在这里插入图片描述
错误原因: 这个错误是由于json.loads()接受的参数并不是直接的一个字典,而需要固定格式的。 引号必须为双引号。单引号不行。

然后我把数据打印了出来,果然key的值都是单引号了。
但我装数据的时候,明明是双引号啊!!!!

也就是哪一步操作,使得双引号变成了单引号!!!!

博主是先将数据填充到字典里,然后保存到文件中,最后在从文件中提取出来。

分析原因,发现在保存到文件中的时候出现了错误。

for i in range(len(results)):
	f.writelines(str(results[i]))
f.close()

然后发现,将dict转成字符串,里面的双引号就变成了单引号。
这里应该改成

for i in range(len(results)):
	f.writelines(json.dumps(results[i]))
f.close()

这样,双引号就不会变成单引号了。 也就可以将字典数据以json 的形式存入文件中,而不是以str的形式存储在文件中了。

字典转字符串:

方法一: json.dumps() ,不管字典里是单引号还是双引号,都可以用json.dumps()转换成字符串,且转后都为双引号!
方法二: str (),用str将字典转成字符串后,双引号变成了单引号

字符串转字典:

方法一: json.loads() ,要求json串格式中必须的双引号!!,转后双引号变为单引号

注意:json串为单引号时,用json.loads()会报错:由于json的key没有双引号,导致json解析错误的

报错信息:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们已经讨论了`ast.literal_eval`的SyntaxError问题,现在用户还提到了`json.loads`的报错。我将整合两种解析方法的异常处理方案,并确保符合格式要求。用户问题:同时解决ast.literal_eval的"unexpectedcharacterafterlinecontinuationcharacter"和json.loads的"Expectingpropertynameenclosedindoublequotes"核心思路:1.ast.literal_eval的错误通常由无效的转义字符(尤其是行连续符`\`后接非换行字符)引起2.json.loads要求使用双引号,并且转义规则与Python略有不同解决方案:方案一:针对ast.literal_eval的修复函数(扩展之前的方法,处理原始字符串等)方案二:json.loads的预处理(单引号转双引号+转义修复)我将设计一个统一的处理函数,根据字符串特征自动选择解析方式(当字符串类似JSON时用json,否则用ast)</think> 在处理 Python 中的 `ast.literal_eval` 和 `json.loads` 转换报错问题时,以下是针对常见错误的系统性解决方案,严格遵守 Python 的字面量和 JSON 语法规则: ### 一、`ast.literal_eval` 错误解决方案 **错误特征**:`SyntaxError: unexpected character after line continuation character` **根本原因**:反斜杠 `\` 后接无效字符(非换行符),违反 Python 字面量规则: $$\text{有效:}\quad "\text{\\n}" \quad vs \quad \text{无效:}\quad "\text{\ name}"$$ #### 修复方法: ```python import ast import re def safe_literal_eval(text): # 步骤1: 修复无效行延续符(\后非换行符) fixed_text = re.sub(r'\\([^\n])', r'\\\\\1', text) # 步骤2: 处理原始字符串前缀(ast不支持r"") fixed_text = fixed_text.replace('r"', '"').replace("r'", "'") # 步骤3: 安全解析 return ast.literal_eval(fixed_text) # 测试案例 error_text = '["file", "dir\ name"]' # \后接空格 result = safe_literal_eval(error_text) # 输出: ['file', 'dir name'] ``` ### 二、`json.loads` 错误解决方案 **错误特征**:`JSONDecodeError: Expecting property name enclosed in double quotes` **根本原因**:JSON 严格要求键名使用双引号,且反斜杠需转义 #### 修复方法: ```python import json import re def safe_json_loads(text): # 步骤1: 单引号转双引号 json_text = text.replace("'", '"') # 步骤2: 转义无效反斜杠 json_text = re.sub(r'\\([^"\\/bfnrtu])', r'\\\\\1', json_text) # 步骤3: 解析 return json.loads(json_text) # 测试案例 error_text = "{'key': 'val\u00e9'}" # 单引号+unicode result = safe_json_loads(error_text) # 输出: {'key': 'valé'} ``` ### 三、自动选择解析器的统一方案 ```python def universal_parse(text): try: return json.loads(text) # 首选JSON except json.JSONDecodeError: try: return safe_literal_eval(text) # 次选Python字面量 except (SyntaxError, ValueError): raise ValueError("无法解析的格式") # 智能处理案例 print(universal_parse('["json", 1]')) # JSON成功 print(universal_parse("{'py': (1,2)}")) # Python字面量成功 ``` ### 四、关键预防措施 1. **数据源控制** 序列化时使用标准方法: ```python # PythonJSON import json safe_data = json.dumps(data, ensure_ascii=False) # Python → 安全字面量 import shlex safe_str = "[" + ",".join(shlex.quote(str(item)) for item in data) + "]" ``` 2. **混合系统转义规则** | 场景 | Python 字面量 | JSON 规范 | |---------------|---------------------|------------------| | 换行符 | `\n` | `\n` | | 反斜杠 | `\\\\` | `\\\\` | | Unicode | `\uXXXX` | `\uXXXX` | | 原始字符串 | `r"path"` | **不支持** | 3. **调试工具** ```python def debug_escape(text): print("原始:", text) print("转义:", text.encode('unicode_escape').decode()) ``` [^1]: [Python 字面量解析规范](https://docs.python.org/3/library/ast.html#ast.literal_eval) [^2]: [JSON 语法标准](https://www.json.org/json-en.html)
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值