def update_with_json(self, jsondict):
        if jsondict is None:
            return
        if not isinstance(jsondict, dict):
            logging.warning("Non-dict type {} fed to `update_with_json` on {}"
                .format(type(jsondict), type(self)))
            return
        
        # loop all registered properties and instantiate
        found = set(['resourceType', 'fhir_comments'])
        nonoptionals = set()
        for name, jsname, typ, is_list, of_many, not_optional in self.elementProperties():
            if not jsname in jsondict:
                if not_optional:
                    nonoptionals.add(of_many or jsname)
                continue
            
            if hasattr(typ, 'with_json_and_owner'):
                setattr(self, name, typ.with_json_and_owner(jsondict[jsname], self))
            else:
                setattr(self, name, jsondict[jsname])
                # TODO: look at `_name` if this is a primitive
            found.add(jsname)
            found.add('_'+jsname)
            if of_many is not None:
                found.add(of_many)
        
        # were there missing non-optional entries?
        if len(nonoptionals - found) > 0:
            for miss in nonoptionals - found:
                logging.warning("Non-optional property '{}' on {} is missing from JSON"
                    .format(miss, self))
        
        # were there superfluous dictionary keys?
        if len(set(jsondict.keys()) - found) > 0:
            for supflu in set(jsondict.keys()) - found:
                logging.warning("Superfluous entry '{}' in JSON for {}"
                    .format(supflu, self))
test that 'literal binds' mode works - no bound params.
dataset/ETHPy150Open smart-on-fhir/client-py/fhirclient/models/fhirabstractbase.py/FHIRAbstractBase.update_with_json--crossover with--dataset/ETHPy150Open zzzeek/sqlalchemy/lib/sqlalchemy/testing/suite/test_select.py/LimitOffsetTest.test_limit_offset_nobinds