2015-12-21 99 views
0

我有一個JSON文件,目前在投入生產之前由手動驗證。理想情況下,這是一個自動化過程,但現在這是一個約束。在崇高文本中查找重複的JSON密鑰3

我在Eclipse中發現的一件事是JSON工具,它會突出顯示JSON文件中的重複鍵。 Sublime Text或插件中是否有類似的功能?

例如,以下JSON可能會產生有關重複鍵的警告。

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

謝謝!

回答

2

還有plenty的在線JSON驗證器可用。我剛剛嘗試this one,它立即挑出重複鍵。使用基於崇高JSON的絨狀JSONLint的問題是,他們使用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

[使用Python的json模塊不會阻止檢查重複鍵](http://stackoverflow.com/a/14902564/4473405),因此可以更新Sublime插件以突出顯示它們,而不需要太多努力。 –

+0

感謝有關這方面的更多信息。我將繼續使用外部驗證,直到過程自動化。感謝您對python如何處理這個問題的澄清。也許某種靈魂可以根據Keith Hall的評論調整插件,但那不是我的遊戲。再次感謝! –

1

即使Python的文件說:

的RFC指定一個JSON對象中的名稱應該是 唯一的,但不要求如何JSON對象重複名應該 處理。默認情況下,該模塊不會引發異常; 相反,它忽略所有但對於一個給定名稱的最後名稱 - 值對:

weird_json =「{ 「×」:1, 「×」: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是很容易的格式,不是很詳細所以像,可以是痛苦的。加倍鍵的檢測很容易,但我敢打賭,僞造插件相當多。