【发布时间】: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 在一起。 为什么不能选择更换服务器?我并不是说我不明白这一点——我曾在公司工作过,以前我也遇到过这种情况。但是,嘿!这些都是不好的做法!服务器当然要修!我们不应该在这里做任何其他广告。如果您需要为此提供支持,请向决定此问题的人员发送此讨论的链接。