【问题标题】:How to handle double quotes in JSON value?如何处理 JSON 值中的双引号?
【发布时间】:2021-01-08 16:02:53
【问题描述】:

我收到了作为 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 对象吗?

【问题讨论】:

  • 什么是创建那个字符串?从 JSON 的角度来看,它已经坏了。
  • 您提到您收到的字符串来自 HTTP 响应。但是,它不是有效的 JSON 格式。您正在通信的服务器是否打算将其解析为 json?
  • 字符串是由外部应用程序(开发人员)创建的,所以我不知道字符串是如何构建的。但是,根据文档,响应应该是 JSON。

标签: python json double-quotes


【解决方案1】:

需要明确的是,这里的正确解决方案是修复发送该 HTTP 响应的任何内容;在 JSON 字符串中包含双引号的正确方法是使用反斜杠:

{ "key": "value with \"double quotes\" inside" }

任何 JSON 解析器都应该接受上述内容作为有效对象。

您无法可靠地解析带有非转义引号的内容,因为您无法分辨哪些是实际的字符串分隔符,哪些是封闭的数据。如果您可以假设引号是平衡的(因此任何字符串中总是有偶数个引号),那么您可以构造一个解析器将其转换为正确的语法,但这不会是一个简单的基于正则表达式的修复。

也就是说,对于您的示例数据,嵌入的引号似乎被空格包围,而实际的分隔符引号却不是。因此,您可以尝试将 "(空格引号)替换为 \"(空格反斜杠引号)和" (引号空格)替换为\" (反斜杠引号空格)和看看有没有用。

【讨论】:

  • 这是有道理的。不幸的是,我无法转义“带空格的双引号”,因为某些用户的答案可能在句子末尾包含双引号。如果有机会发送带有转义引号的响应,我将尝试与开发人员交谈。谢谢
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多