code: def read_json(self):
          
          with reading_ancillary_files(self):
              if self.json_uri is None:
                  metadata = self._read_json_db()
              else:
                  metadata = self._read_json_file()
              if 'properties' in metadata:
                  for name, prop in list(metadata['properties'].items()):
                      try:
                          self.set(prop['name'], prop['value'], prop['xml_path'])
                      except KeyError:
                          # we just skip if we don't have something, we want
                          # to have as much as possible read from the JSON
                          pass
          return metadata
docs: read metadata from json and set all the found properties.
  
          when overriding remember to wrap your calls in reading_ancillary_files
  
          :return: the read metadata
          :rtype: dict