正确处理看似JSON对象但被单引号包裹的字符串的方法

5 投票
4 回答
2247 浏览
提问于 2025-04-16 20:38

根据定义,JSON字符串是用双引号包裹起来的。

实际上:

json.loads('{"v":1}') #可以正常工作

json.loads("{'v':1}") #无法正常工作

那么,如何处理第二种情况呢?我希望找到一种不同于eval或替换的方法。谢谢。

4 个回答

2

如果你无法修复另一边的问题,那你就得把无效的JSON转换成有效的JSON。我觉得下面的代码可以正确处理转义字符:

def fixEscapes(value):
  # Replace \' by '
  value = re.sub(r"[^\\]|\\.", lambda match: "'" if match.group(0) == "\\'" else match.group(0), value)
  # Replace " by \"
  value = re.sub(r"[^\\]|\\.", lambda match: '\\"' if match.group(0) == '"' else match.group(0), value)
  return value

input = "{'vt\"e\\'st':1}"
input = re.sub(r"'(([^\\']|\\.)+)'", lambda match: '"%s"' % fixEscapes(match.group(1)), input)
print json.loads(input)
2

如果你遇到格式不正确的json,为什么不在之前把双引号换成单引号呢?

json.load
1

我不太确定我是否理解了你的需求,不过你是在找这样的东西吗?

def fix_json(string_):
    if string_[0] == string_[-1] == "'":
        return '"' + string_[1:-1] +'"'
    return string_

使用示例:

>>> fix_json("'{'key':'val\"'...cd'}'")
"{'key':'val"'...cd'}"

编辑:看起来我在上面例子中想要的幽默感并没有解释清楚。所以,这里有另一个例子:

>>> fix_json("'This string has - I'm sure -  single quotes delimiters.'")
"This string has - I'm sure -  single quotes delimiters."

这个例子展示了“替换”只发生在字符串的两端,而不是在中间。

当然,你也可以用正则表达式来实现同样的效果,但如果你只是想检查字符串的开头和结尾字符,我觉得用普通的字符串索引会更容易理解……

撰写回答