python - 如何处理 JSON 值中的双引号?
问题描述
我有作为 HTTP 响应接收的字符串。不幸的是,该字符串是原始格式,我无法将其转换为 JSON 对象。
示例字符串:
json_string = '{"client_id":8888,"time":null,"questions":{"id":10000,"answered":"true","answer":"The "project" was good, I enjoyed it. Do you plan to repeat it?"},"other":"When is the "project" released?"}'
该字符串的问题在于它在某些值(用户答案)中包含双引号。可以包含双引号的值的键并不总是相同的(这里的“答案”和“其他”在其他响应中可能不同)。用户答案可以包含任何字符(逗号、方括号、双引号,...)。
我尝试使用不同的加载器(json、yaml),甚至尝试使用正则表达式自己解析字符串,但总是失败。
有什么办法可以将此字符串转换为 JSON 对象?
解决方案
需要明确的是,这里的正确解决方案是修复发送该 HTTP 响应的任何内容;在 JSON 字符串中包含双引号的正确方法是使用反斜杠:
{ "key": "value with \"double quotes\" inside" }
任何 JSON 解析器都应该接受上述内容作为有效对象。
您无法可靠地解析带有非转义引号的内容,因为您无法分辨哪些是实际的字符串分隔符,哪些是封闭的数据。如果您可以假设引号是平衡的(因此任何字符串中总是有偶数个引号),那么您可以构造一个解析器将其转换为正确的语法,但这不会是一个简单的基于正则表达式的修复。
也就是说,对于您的示例数据,嵌入的引号似乎被空格包围,而实际的分隔符引号不是。因此,您可以尝试通过将 "
(space-quote)替换为 ( \"
space-backslash-quote) 和"
(quote-space) 替换为\"
(backslash-quote-space) 来运行它,看看是否可行。
推荐阅读
- versioning - 重新发布工件时,de 版本应该如何看待
- bash - 查询在 bash 中为 psql 返回 null
- maven - StormCrawler /Elastic Search Apache Tika 用于解析 PDF。运行拓扑时出错
- postgresql - 在 Springboot 应用程序上同步 Elasticsearch Postgresql
- java - 在 Java8 中使用流重写
- c - perf_event 报告意外的缓存未命中量:访问数组中的 N 个元素会导致 2N 次缓存未命中
- python - 尝试从列表中删除重复时位于位置打印语句的 Python 生成器对象
- r - 用数字替换文本值
- gcloud - GCloud 构建 YAML 替换不起作用
- ios - 如何在我们应用快照时停止 UICollectionViewDiffableDataSource 滚动集合视图?