0

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 ''
  • You might want to try [`json_schema`](https://stackoverflow.com/questions/54491156/validate-json-data-using-python). – meowgoesthedog Mar 20 '19 at 12:08
  • @meowgoesthedog The schema for the dictionary is actually a json file, I only posted a part of it, but I need to add the missing keys, not to say if the dictonary is valid or not. –  Mar 20 '19 at 12:30

0 Answers0