2016-11-25 31 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

是的,这是我想熊猫周围,哈哈。尽管伟大的自由! –