【问题标题】:JSON String with elements containing unescaped double quotes包含未转义双引号的元素的 JSON 字符串
【发布时间】:2021-12-27 06:08:01
【问题描述】:

尝试从 AJAX 请求解析 JSON 时,返回的字符串包含无效的 JSON。

虽然最好的做法是更改服务器以使用有效的 JSON 进行回复,正如多个相关答案中所建议的那样,但这不是一个选项。

尝试使用python解决这个问题,我查看了正则表达式。

主要问题是以下元素(我目前用作测试字符串:

testStr = '{"KEY1":"THIS IS "AN" ELEMENT","KEY2":"""THIS IS ANOTHER "ELEMENT""}'

我目前使用以下代码:

jsonString = re.sub(r'(?<=\w)\"(?=[^\(\:\}\,])','\\"',testStr)
jsonString = re.sub(r'\"\"(?![,}:])','\"\\\"',jsonString)

取得的成功非常有限。

如果我使用 C,我会解析字符串,然后简单地转义元素内的所有双引号(即在所有以 [:{},] 开头的双引号之间)

必须有一种pythonic的方式来解析,而不是诉诸for循环并向前看,并保留历史记录。

编辑:

假设字符串不包含: [ : { } ] 并且还假设未转义的双引号仅在值内,而不在键内, 然后我假设以下(或类似的东西应该可以解决问题:

 import re
 re.sub(r'(?<![\[\:])\"(?![,\}),'\"',testString)

但它仍然不起作用。

【问题讨论】:

  • 这是非决定性的……在某些情况下,您无法知道 " 是分隔符还是值的一部分……:0(
  • 我明白了,如果字符串从不包含 "[ : { } ," 怎么办?它仍然是非决定性的吗?
  • 如果字符串从来没有,,那么它应该是可能的,但看起来这仍然是一个向前看的情况,因为你需要知道,跟在@987654327之后@ ...如果您的JSON总是在"之后立即有,,那么可以用单个字符完成前瞻...如果"之后可能有空格,那么您显然必须更加努力!!
  • 为什么无法修复有缺陷的非 JSON 生产者代码?有一个坏掉的程序会吐出可怕的伪 JSON 而没有尝试修复它是荒谬的。
  • 我和@JonathanLeffler 在一起。 为什么不能选择更换服务器?我并不是说我不明白这一点——我曾在公司工作过,以前我也遇到过这种情况。但是,嘿!这些都是不好的做法!服务器当然要修!我们不应该在这里做任何其他广告。如果您需要为此提供支持,请向决定此问题的人员发送此讨论的链接。

标签: python regex json


【解决方案1】:

看来我需要休息一下来解决这个问题。

以下正则表达式似乎只替换了元素字符串中包含的双引号。 (根据我在问题中陈述的假设)

output = re.sub(r'(?<![\[\:\{\,])\"(?![\:\}\,])','\\\"', stringName)

我在这里创建了一个沙盒:https://repl.it/vNK

示例输出:

Original String:
{"KEY1":"THIS IS "AN" ELEMENT","KEY2":"""THIS IS ANOTHER "ELEMENT""}

Modified String:
{"KEY1":"THIS IS \"AN\" ELEMENT","KEY2":"\"\"THIS IS ANOTHER \"ELEMENT\""}

Parsed JSON:
{
    "KEY1": "THIS IS \"AN\" ELEMENT",
    "KEY2": "\"\"THIS IS ANOTHER \"ELEMENT\""
}

欢迎提出任何建议。

【讨论】:

  • 这使我摆脱了一个可怕的情况(修复 JSON 错误地存储在 postgres json 列中作为一个数组,其中包含一个长转义 JSON 字符串)。一些编码字符串包含双引号,它几乎让我崩溃。对于任何其他迷失的灵魂,regex101.com 将帮助解释这个神奇的、神奇的正则表达式是如何工作的。
  • 我应该在看到您的评论后立即回复您。原来我在解码 JSON 之前在 python 中解码 UTF。当 UTF 被解码时,出现了额外的双引号(编码的双引号)并且 JSON 解码器抱怨。这是通过解码 JSON first 然后是实际数据来解决的。 (D'哦!)
猜你喜欢
  • 2020-01-03
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2019-01-22
  • 2020-03-17
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多