I need to check if all the keys declared in a schema file are present in a dictionary and if they are not, I need to fill them with a default value, of a given type. I need to do this dynamically because the structure can be even more complicated than the one below.
{ "type": "object", "properties": { "vid": { "type": ["null", "integer"] }, "merged-vids": { "type": ["null", "array"], "items": { "type": ["null", "integer"] } }, "portal-id": { "type": ["null", "integer"] }, "is-contact": { "type": ["null", "boolean"] } "form-submissions": { "type": ["null", "array"], "items": { "type": ["null", "object"], "properties": { "conversion-id": { "type": ["null", "string"] }, "timestamp": { "type": ["null", "string"], "format": "date-time" }, "form-id": { "type": ["null", "string"] }, "portal-id": { "type": ["null", "integer"] }, "page-url": { "type": ["null", "string"] }, "title": { "type": ["null", "string"] } } } } } } This is an example of dictionary:
{ "vid": 1000, "portal-id": 2512, "is-contact": true, "profile-token": "dummy_profile_token", "profile-url": "dummy_profile_url", "form-submissions": [ { "conversion-id": "127-798", "timestamp": 1484080167266, "form-id": "70fd-4b98-14796-777", "page-url": "https://example.com/landing-page-url", "title": "A new test form", "meta-data": [] } ] } I am also new to python and this is a bit too much. This is what I tried, but I cannot figure out what to do.
def get_default(type_object): if type_object == 'object': new_dict = {} elif type_object == 'array': return [] else: return '' def fill_fields_with_empty_str(record, schema): if isinstance(schema['type'], list): type_obj = schema['type'][len(schema['type'])-1] elif isinstance(schema['type'], str): type_obj = schema['type'] if type_obj == 'object': new_dict = {} for key in schema['properties'].keys(): if not record.get(key): record[key] = get_default(schema['properties'][key]['type']) new_dict[key] = fill_fields_with_empty_str(record[key], schema['properties'][key]) return new_dict elif type_obj == 'array': new_list = [] type_obj = schema["items"]['type'] if len(record) == 0: record = get_default(type_obj) for element in schema["items"]: new_list.append(fill_fields_with_empty_str(record, schema['items'])) return new_list else: return ''
json_schema.