正确处理看似JSON对象但被单引号包裹的字符串的方法
根据定义,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."
这个例子展示了“替换”只发生在字符串的两端,而不是在中间。
当然,你也可以用正则表达式来实现同样的效果,但如果你只是想检查字符串的开头和结尾字符,我觉得用普通的字符串索引会更容易理解……