def is_valid(self, field_name, value) -> (bool, object):
        """
        Return true if the value type matches or can be coerced to the defined type in schema, otherwise false.
        If field not defined, return none

        Args:
            field_name: str
            value:

        Returns: bool, value, where the value may have been coerced to the required type.
        """

        if self.has_field(field_name):
            if self.fields_dict[field_name] == FieldType.KG_ID:
                return True, value

            if self.fields_dict[field_name] == FieldType.NUMBER:
                if isinstance(value, numbers.Number):
                    return True, value
                else:
                    converted_number = self.parse_number(value)
                    return (False, value) if not converted_number else (True, value)
            if self.fields_dict[field_name] == FieldType.STRING:
                if isinstance(value, str):
                    return True, value.strip()
                else:
                    return True, str(value).strip()

            if self.fields_dict[field_name] == FieldType.DATE:
                valid, d = self.is_date(value)
                if valid:
                    return True, d.isoformat()
                else:
                    return False, value

            if self.fields_dict[field_name] == FieldType.LOCATION:
                valid, l = self.is_location(value)
                if valid:
                    return True, l
                else:
                    return False, value
        else:
            print('{} not found in KG Schema'.format(field_name))
            return False, value
Return true if the value type matches or can be coerced to the defined type in schema, otherwise false.
        If field not defined, return none

        Args:
            field_name: str
            value:

        Returns: bool, value, where the value may have been coerced to the required type.