【问题标题】:Python: How to escape double quote inside json string value?Python:如何在 json 字符串值中转义双引号?
【发布时间】:2017-03-02 05:11:13
【问题描述】:

我在 python 中解析 json 字符串时遇到问题,因为字符串值中有额外的双引号,例如 {"name": "Jack O"Sullivan", "id": "1"}

我正在尝试将其转换为列表以进行进一步评估,如下所示:

import ast
js = '{"name": "Jack O"Sullivan", "id": "1"}'
ast.literal_eval(js).values()  

如何将 json 字符串更改为类似 "Jack O\'Sullivan" 的内容,以便正确评估。

编辑只是为了强调我知道 json 是无效的,但这就是我所拥有的,并且更改源不是一种选择。我目前正在寻求解决这个限制。

【问题讨论】:

  • 这个字符串是从哪里来的?修复源可能更容易。
  • ast.literal_eval() 不会比json.loads() 更好地解码这个,不。字符串中不带引号的引号在 Python 中同样无效。
  • 您是否100% 确定源产生了不带引号的引号(这不是试图在 Python 字符串文字中重现这一点并忘记逃避转义的人工制品)?如果是这样,这在源头上更容易修复,因为现在几乎不可能检测到哪些引号是值,哪些是分隔符。
  • 当然是完全无效的 JSON。
  • 大家好,是的,我知道 json 无效。但目前在 NOT 选项中更正来源。因此,我希望手动替换字符串中的双引号。这些出现在一个人的名字或姓氏中,所以可能有办法。

标签: python json


【解决方案1】:
import re

json = '{"name": "Jack O"Sullivan", "id": "1"}'

fixed = re.sub(r'("[\s\w]*)"([\s\w]*")',r"\1\'\2", json)

我怀疑这会起作用(repl.it 的工作示例),它使用以下正则表达式:

("[\s\w]*)"([\s\w]*")

然后用\' 替换任何内部"。只要包含列表有效([\s\w]),这将起作用,即有效字符串将仅包含空格和单词字符。您可能需要为更复杂的名称添加其他可能性。

它匹配任何字符串"<alpha/space>"<alpha/space>",然后使用捕获组和反向引用将其替换为"<whatwasbefore>\'<whatwasafter>"

查看regex101的示例

正如我在 cmets 中提到的,替代方法是使其排除 json 控制字符 [^{}:,]。这应该会产生类似的结果,但不会错过其中包含其他字符的名称(例如 -)。

【讨论】:

  • 是的,这正是我所需要的。进行了一些更改以包括名称中包含 & 字符的情况,但这对我有用。谢谢!
  • @sfactor 另一种方法是在 json 结构中创建一个排除组:[^{},:] 可能会起作用。
  • 我猜这可能会使它更普遍。有什么例子可以说明它是如何工作的?
  • @sfactor 它的工作方式完全相同:[^<stuff>] 是一个否定字符集:它接受集合中 not 的任何内容。所以[^abc] 将接受不是abc 的任何字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多