2016-11-25 55 views
0

我正在將API從slim/PHP轉換爲flask/Python。JSON驗證,使模式中定義的所有鍵都需要

我在slim應用程序中使用JSON驗證程序,在這種情況下,默認情況下,模式中的對象中指定的所有鍵都是必需的。除非指定爲「可選」,否則會導致驗證失敗,如果缺少密鑰。我的安裝pip install jsonschema用於我的python。默認情況下,除非在對象之後根據需要指定,否則不需要鍵。

有沒有什麼辦法讓這個驗證器的python「版本」像我正在使用的slim「version」一樣工作?這將節省大量更新我已經定義的模式。

回答

0

Pandas是一個偉大的圖書館,以幫助數據:

from pandas.io.json import json_normalize 

req = ['p1', 'p2.p2A', 'p3'] # required parameters 
rec = {'p1' : 1, 'p2' : {'p2A' : 2, 'p2B':3}, 'p3':4} # what we received 

recFlat = json_normalize(rec).to_dict().keys() # flatten received parameters, and get the list of the keys 
print('required: %s' % req) 
print('received: %s' % rec) 
print(' flat : %s' % recFlat) 

req_in_rec = set(req).issubset(recFlat) # test if required parameters are in received parameters 
print('required parameters set: ', req_in_rec) 

req.append('p22.A') # new parameters are required 
req.append('p4') 
print('\nnew required parameters : %s' % req) 
req_in_rec = set(req).issubset(recFlat) # test if required parameters are in received parameters 
print('required parameters set: ', req_in_rec) 

missing_parameters = list(req - recFlat) 
print('missing parameters : %s' % missing_parameters) 

輸出:

required: ['p1', 'p2.p2A', 'p3'] 
received: {'p2': {'p2A': 2, 'p2B': 3}, 'p3': 4, 'p1': 1} 
    flat : dict_keys(['p2.p2B', 'p2.p2A', 'p1', 'p3']) 
required parameters set: True 

new required parameters : ['p1', 'p2.p2A', 'p3', 'p22.A', 'p4'] 
required parameters set: False 
missing parameters : ['p4', 'p22.A'] 
+0

這似乎仍然需要明確地指定所需的字段,比只用大熊貓也許一個額外的依賴json-schema規範中的'required'字段。 http://json-schema.org/examples.html – danielx

+0

是的,這是我想熊貓周圍,哈哈。儘管偉大的自由! –