我有一个JSON文件,目前,在投入生产之前,需要手动验证。理想情况下,这是一个自动化过程,但目前这是约束。
我发现在Eclipse中有用的一件事是JSON工具可以突出显示JSON文件中的重复键。 Sublime Text或插件中是否有类似的功能?
例如,以下JSON可能会产生有关重复键的警告。
{
"a": 1,
"b": 2,
"c": 3,
"a": 4,
"d": 5
}
谢谢!
答案 0 :(得分:2)
在线提供plenty个JSON验证器。我刚尝试了this one,它立即挑出了重复的密钥。使用像JSONLint
这样的基于Sublime的JSON链接的问题是它们使用Python的json
模块,这对额外的键没有错误:
import json
json_str = """
{
"a": 1,
"b": 2,
"c": 3,
"a": 4,
"d": 5
}"""
py_data = json.loads(json_str) # changes JSON into a Python dict
# which is unordered
print(py_data)
产量
{'c': 3, 'b': 2, 'a': 4, 'd': 5}
显示第一个a
键被第二个覆盖。所以,你需要另一个非基于Python的工具。
答案 1 :(得分:2)
即使Python文档也说:
RFC指定JSON对象中的名称应该是 唯一的,但不强制JSON对象中重复的名称应该如何 被处理。默认情况下,此模块不会引发异常; 相反,它会忽略除给定名称的最后一个名称 - 值对之外的所有名称:
weird_json ='{“x”:1,“x”:2,“x”:3}' json.loads(weird_json){'x':3}
object_pairs_hook参数可用于改变此行为。
从文档中指出:
class JsonUniqueKeysChecker:
def __init__(self):
self.keys = []
def check(self, pairs):
for key, _value in pairs:
if key in self.keys:
raise ValueError("Non unique Json key: '%s'" % key)
else:
self.keys.append(key)
return pairs
然后:
c = JsonUniqueKeysChecker()
print(json.loads(json_str, object_pairs_hook=c.check)) # raises
JSON格式非常简单,不是很详细,所以这样的事情可能很痛苦。检测双键是很容易的,但我敢打赌从中插入插件需要做很多工作。