def unserialize(j_obj, no_load=False):
    """
    Un-serialize object. If we have __sys_python_module__ we try to safely get the alignak class
    Then we re-instantiate the alignak object

    :param j_obj: json object, dict
    :type j_obj: str (before loads)
    :param no_load: if True, j_obj is a dict, otherwise it's a json and need loads it
    :type no_load: bool
    :return: un-serialized object
    """
    if not j_obj:
        return j_obj
    # print("Unserialize (%s): %s" % (no_load, j_obj))

    if no_load:
        data = j_obj
    else:
        data = json.loads(j_obj)

    if isinstance(data, dict):
        if '__sys_python_module__' in data:
            cls = get_alignak_class(data['__sys_python_module__'])
            # Awful hack for external commands ... need to be refactored!
            if data['__sys_python_module__'] in ['alignak.external_command.ExternalCommand']:
                return cls(data['content']['cmd_line'], data['content']['creation_timestamp'])

            return cls(data['content'], parsing=False)

        data_dict = {}
        for key, value in list(data.items()):
            data_dict[key] = unserialize(value, True)
        return data_dict

    if isinstance(data, list):
        return [unserialize(item, True) for item in data]

    return data
Un-serialize object. If we have __sys_python_module__ we try to safely get the alignak class
    Then we re-instantiate the alignak object

    :param j_obj: json object, dict
    :type j_obj: str (before loads)
    :param no_load: if True, j_obj is a dict, otherwise it's a json and need loads it
    :type no_load: bool
    :return: un-serialized object