Я создаю файл JSON в определенном формате и поэтому хочу проверить, находится ли он в этом формате или нет, прежде чем продолжить обработку.
Так выглядит шаблон
{
"dev":{
"username": "",
"script": "",
"params": ""
},
"qat":{
"username": "",
"script": "",
"params": ""
},
}
файл будет там, где все значения заполнены, для username, script и params как для dev, так и для qat
Теперь я хочу убедиться, что файл с данными в точности совпадает с шаблоном. пока я использую следующий подход.
Подход Преобразуйте эти файлы в dict, а затем получите все ключи. А затем сравните эти ключи, если они равны, файл JSON соответствует шаблону, иначе нет.
Это работает так, как ожидалось, но просто хотел проверить, есть ли более простой подход для этого.
Код:
def test_param_file():
with open('../utils/param_template.json') as json_data:
template = json.load(json_data)
with open('/file.json') as json_data:
param_file = json.load(json_data)
assert _get_all_keys(param_file) == _get_all_keys(template)
def _get_all_keys(param):
global prefix
global keys
keys = []
def func(param):
for key, value in param.iteritems():
if type(value) == dict:
global prefix
prefix = key
func(value)
global keys
keys.append("%s.%s" % (prefix, key))
func(param)
return list(set(keys))
Если это работает, и вы хотите улучшить / оптимизировать свой код, вы должны опубликовать его на обзор кода.






Поскольку вы ищете более простой / лучший подход, я рекомендую посмотреть зефирка для такого рода проверок. Вот очень грубый пример:
from marshmallow import Schema, fields
class EnviornmentSchema(Schema):
username = fields.Str(required=True)
scripts = fields.Str(required=True)
params = fields.Str(required=True)
errors = EnviornmentSchema().validate(file_contents_dict)
По сути, он заменяет вашу "шаблонную" систему классом схемы. Вы также можете использовать гнездование, поскольку у вас есть несколько dicts среды. Marshmallow становится очень полезным, когда вам нужно выполнить более сложную проверку.