Get a :class:`~jira.client.ResultList` of issue Resources matching a JQL search string.

        :param jql_str: The JQL search string.
        :type jql_str: str
        :param startAt: Index of the first issue to return. (Default: 0)
        :type startAt: int
        :param maxResults: Maximum number of issues to return. Total number of results
            is available in the ``total`` attribute of the returned :class:`~jira.client.ResultList`.
            If maxResults evaluates as False, it will try to get all issues in batches. (Default: 50)
        :type maxResults: int
        :param validate_query: Whether or not the query should be validated. (Default: True)
        :type validate_query: bool
        :param fields: comma-separated string or list of issue fields to include in the results.
            Default is to include all fields.
        :type fields: Optional[str or list]
        :param expand: extra information to fetch inside each resource
        :type expand: Optional[str]
        :param json_result: JSON response will be returned when this parameter is set to True.
                Otherwise, :class:`~jira.client.ResultList` will be returned.
        :type json_result: bool

        :rtype: dict or :class:`~jira.client.ResultList`

def search_issues(self,
                      jql_str,
                      startAt=0,
                      maxResults=50,
                      validate_query=True,
                      fields=None,
                      expand=None,
                      json_result=None,
                      ):
        """Get a :class:`~jira.client.ResultList` of issue Resources matching a JQL search string.

        :param jql_str: The JQL search string.
        :type jql_str: str
        :param startAt: Index of the first issue to return. (Default: 0)
        :type startAt: int
        :param maxResults: Maximum number of issues to return. Total number of results
            is available in the ``total`` attribute of the returned :class:`~jira.client.ResultList`.
            If maxResults evaluates as False, it will try to get all issues in batches. (Default: 50)
        :type maxResults: int
        :param validate_query: Whether or not the query should be validated. (Default: True)
        :type validate_query: bool
        :param fields: comma-separated string or list of issue fields to include in the results.
            Default is to include all fields.
        :type fields: Optional[str or list]
        :param expand: extra information to fetch inside each resource
        :type expand: Optional[str]
        :param json_result: JSON response will be returned when this parameter is set to True.
                Otherwise, :class:`~jira.client.ResultList` will be returned.
        :type json_result: bool

        :rtype: dict or :class:`~jira.client.ResultList`

        """
        if isinstance(fields, string_types):
            fields = fields.split(",")
        else:
            fields = list(fields or [])

        # this will translate JQL field names to REST API Name
        # most people do know the JQL names so this will help them use the API easier
        untranslate = {}  # use to add friendly aliases when we get the results back
        if self._fields:
            for i, field in enumerate(fields):
                if field in self._fields:
                    untranslate[self._fields[field]] = fields[i]
                    fields[i] = self._fields[field]

        search_params = {
            "jql": jql_str,
            "startAt": startAt,
            "validateQuery": validate_query,
            "fields": fields,
            "expand": expand}
        if json_result:
            search_params["maxResults"] = maxResults
            if not maxResults:
                warnings.warn('All issues cannot be fetched at once, when json_result parameter is set', Warning)
            return self._get_json('search', params=search_params)

        issues = self._fetch_pages(Issue, 'issues', 'search', startAt, maxResults, search_params)

        if untranslate:
            for i in issues:
                for k, v in iteritems(untranslate):
                    if k in i.raw.get('fields', {}):
                        i.raw['fields'][v] = i.raw['fields'][k]

        return issues