在Sublime Text 3中查找重复的JSON密钥

时间:2015-12-21 17:24:47

标签: json sublimetext3 sublimetext

我有一个JSON文件,目前,在投入生产之前,需要手动验证。理想情况下,这是一个自动化过程,但目前这是约束。

我发现在Eclipse中有用的一件事是JSON工具可以突出显示JSON文件中的重复键。 Sublime Text或插件中是否有类似的功能?

例如,以下JSON可能会产生有关重复键的警告。

{
    "a": 1,
    "b": 2,
    "c": 3,
    "a": 4,
    "d": 5
}

谢谢!

2 个答案:

答案 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格式非常简单,不是很详细,所以这样的事情可能很痛苦。检测双键是很容易的,但我敢打赌从中插入插件需要做很多工作。