@classmethod
def _get_json_error_keys(cls, obj, json_path='storage'):
    """Identify the paths with the storage which failed to be JSON encoded.

        Return an iterable of message strings.

        """
    if isinstance(obj, dict):
        for k, v in obj.items():
            if isinstance(v, cls.JSON_PRIMITIVES):
                continue
            subpath = '{}[{!r}]'.format(json_path, k)
            yield from cls._get_json_error_keys(v, subpath)
    elif isinstance(obj, (list, tuple)):
        for i, value in enumerate(obj):
            if isinstance(value, cls.JSON_PRIMITIVES):
                continue
            subpath = '{}[{}]'.format(json_path, i)
            yield from cls._get_json_error_keys(value, subpath)
    elif isinstance(obj, cls.JSON_PRIMITIVES):
        return
    else:
        t = type(obj)
        if t.__module__ != 'builtins':
            typename = '{t.__module__}.{t.__qualname__}'.format(t=t)
        else:
            typename = t.__qualname__
        yield json_path, typename
