You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将JSON字符串解析为Python字典时遇到无效转义错误的问题

解决JSON转义错误的方案

首先,你的问题有两个核心根源:

  • 字符串里的"HTML实体转义的引号,而JSON要求使用原生双引号",解析器完全无法识别"这种格式。
  • 字符串中的单个反斜杠\在JSON中属于无效转义——JSON规定反斜杠必须自身转义为\\,否则像\F这种组合会被判定为非法转义字符,直接触发解码错误。

修复步骤

下面是具体的修复代码,分两步解决问题:

  1. 解码HTML实体:把所有"替换为双引号",用Python标准库的html.unescape()来做比手动替换更可靠,还能处理其他可能存在的HTML转义。
  2. 修复反斜杠转义:把字符串中的单个\替换为\\,确保JSON解析器能正确识别这是一个普通的反斜杠字符。

修复后的完整代码:

import json
import html

# 保留你提供的原始字符串
work_orders_inprogress = ''' { "ItemCollection": [ { "Header": { "ID": "work_orderID", "CreationTime": "2021-03-17T12:12:47.02-04:00", "DeletionTime": "0001-01-01T00:00:00", "DeletionTimeSpecified": true, "LastModifiedTime": "2021-10-29T12:12:23.73-04:00", "LastModifiedBy": "Mit_rando.Province\\First Last" }, "ID": "work_orderID", "Type": "WorkOrder", "ScheduledTime": "2021-03-19T12:06:00.937-04:00", "PromisedTime": "2021-06-01T19:00:00-04:00", "InvoiceTime": "0001-01-01T00:00:00", "WorkOrderNumber": 35659, "InvoiceNumber": 0, "PurchaseOrderNumber": "", "Contact": { "Header": { "ID": "work_orderID", "CreationTime": "2021-03-09T13:00:06.77-05:00", "DeletionTime": "0001-01-01T00:00:00", "DeletionTimeSpecified": true, "LastModifiedTime": "2021-08-30T15:21:28.25-04:00", "LastModifiedBy": "Mit_rando.province\\First Last" }, "ID": "work_orderID", "FileAs": "Business - CASH CUSTOMER", "Name": { "Title": "Manager", "Prefix": "", "FirstName": "First", "MiddleName": "", "LastName": "Last", "Suffix": "" }, "Address": { "Title": "Business", "ID": "work_orderID", "Street": "some random st", "City": "cityname", "Province": "XX", "PostalCode": "XXXXX", "Country": "USA" }, "Company": "Company Name - CASH CUSTOMER", "Phone1Title": "Business", "Phone1": "(720) fakenumber", "Phone2Title": "Cell", "Phone2": "(303) fakenumber", "EmailTitle": "Email", "Email": "fake@email.org", "PreferredContactMethod": "Email", "MarketingSource": "", "Note": "", "NoMessaging": false, "NoEmail": false, "NoPostCard": false } } ] } '''

# 第一步:解码HTML实体,将&quto;替换为标准双引号
unescaped_str = html.unescape(work_orders_inprogress)
# 第二步:把单个反斜杠替换为JSON可识别的转义反斜杠
fixed_str = unescaped_str.replace('\\', '\\\\')

# 解析修复后的JSON字符串
data = json.loads(fixed_str)
print(type(data))  # 输出 <class 'dict'>,表示解析成功

为什么之前的尝试没效果?

你之前尝试调整\\\,但忽略了两个关键问题:

  • 原始字符串里的&quot;根本不是JSON的合法引号,解析器第一步就无法识别正确的JSON结构,调整反斜杠也没用。
  • 在Python字符串中,\\会被解释为单个\,所以直接写\\传给json.loads时,JSON看到的还是单个\,依然是无效转义——必须让JSON看到\\,所以在Python里要写成\\\\,或者用replace批量替换更省心。

额外建议

如果这段内容是直接从API获取的响应,建议检查API的返回类型:正常的JSON接口应该返回application/json类型,不会包含&quot;这种HTML转义。如果API确实返回了带HTML转义的内容,可能是后端的问题,不过用上面的方法可以临时解决这个问题。

内容的提问来源于stack exchange,提问作者Matt

火山引擎 最新活动