'Get a ResultList of issue Resources matching a JQL search string.
:param jql_str: the JQL search string to use
:param startAt: index of the first issue to return
:param maxResults: maximum number of issues to return. Total number of results
is available in the ``total`` attribute of the returned ResultList.
If maxResults evaluates as False, it will try to get all issues in batches.
:param fields: comma-separated string of issue fields to include in the results
:param expand: extra information to fetch inside each resource
:param json_result: JSON response will be returned when this parameter is set to True.
Otherwise, ResultList will be returned.'

def search_issues(self, jql_str, startAt=0, maxResults=50, validate_query=True, fields=None, expand=None, json_result=None):

    if (fields is None):
        fields = []
    if isinstance(fields, string_types):
        fields = fields.split(u',')
    untranslate = {}
    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 = {u'jql': jql_str, u'startAt': startAt, u'validateQuery': validate_query, u'fields': fields, u'expand': expand}
    if json_result:
        search_params[u'maxResults'] = maxResults
        if (not maxResults):
            warnings.warn(u'All    issues    cannot    be    fetched    at    once,    when    json_result    parameter    is    set', Warning)
        return self._get_json(u'search', params=search_params)
    issues = self._fetch_pages(Issue, u'issues', u'search', startAt, maxResults, search_params)
    if untranslate:
        for i in issues:
            for (k, v) in iteritems(untranslate):
                if (k in i.raw.get(u'fields', {})):
                    i.raw[u'fields'][v] = i.raw[u'fields'][k]
    return issues
