Как сравнить JSON с рисунком в Python?
Данные JSON:
{
"options": {
"name": "aaa",
"count": 20,
"a1": 30
},
"PC": {
"processor": "Intel",
"os": "windows"
}
}
Шаблон:
{
"options": {
"name": "string",
"count": "integer",
"a1": "integer"
},
"PC": {
"processor": "string",
"os": "string"
}
}
Как проверить, что все ключи есть и их тип одинаков?
import json
data = '{"options": {"name": "aaa","count": 20,"a1": 30},"PC": {"processor": "Intel","os": "windows"}}'
pattern = '{"options": {"name": "string","count": "integer","a1": "integer"},"PC": {"processor": "string","os": "string"}}'
json_data = json.loads(data)
json_pattern = json.loads(pattern)
for key in json_pattern.keys():
if key not in json_data:
print("Error: %s" % key)
print("end")
json_pattern.keys()
только возврат options
а также PC
, но мне нужно name, count, a1, processor, os
тоже.
И еще один вопрос, как это узнать PC
а также options
переменная, которая содержит другие переменные? Извините за мой английский.
1 ответ
Вы можете использовать рекурсию с zip
:
import __builtin__ as built
testing_data = [[{"options": {"name": "aaa", "count": 20, "a1": 30}, "PC": {"processor": "Intel", "os": "windows"}}, {"options": {"name": "string","count": "integer", "a1": "integer"}, "something": {"processor": "string", "os": "string"}}]]
def check_input(a, b):
for [c, d], [g, f] in zip(sorted(a.items(), key=lambda x:x[0]), sorted(b.items(), key=lambda x:x[0])):
if c != g:
raise ValueError("Wrong key. Expecting '{}', not '{}'".format(g, c))
if not isinstance(d, dict) and not isinstance(f, dict) and not isinstance(d, getattr(built, f[:3])):
raise TypeError("Wrong value type. Expecting '{}' for key '{}', not '{}'".format(f, g, type(d).__name__))
if all(isinstance(i, dict) for i in [d, f]):
check_input(d, f)
for i in testing_data:
check_input(*i)