Queries a url for json data

    Note: Requests are cached using requests_cached for a week, this is done
    transparently by using the package's monkey patching

def _request_json(
    url,
    parameters=None,
    body=None,
    headers=None,
    cache=True,
    agent=None,
    reattempt=5,
):
    """ Queries a url for json data

    Note: Requests are cached using requests_cached for a week, this is done
    transparently by using the package's monkey patching
    """
    assert url
    content = None
    status = 500
    log.info("url: %s" % url)

    if isinstance(headers, dict):
        headers = _clean_dict(headers)
    else:
        headers = dict()
    if isinstance(parameters, dict):
        parameters = _d2l(_clean_dict(parameters))
    if body:
        method = "POST"
        headers["content-type"] = "application/json"
        headers["user-agent"] = _get_user_agent(agent)
        headers["content-length"] = ustr(len(body))
    else:
        method = "GET"
        headers["user-agent"] = _get_user_agent(agent)

    initial_cache_state = SESSION._is_cache_disabled  # yes, i'm a bad person
    try:
        SESSION._is_cache_disabled = not cache
        response = SESSION.request(
            url=url,
            params=parameters,
            json=body,
            headers=headers,
            method=method,
            timeout=1,
        )
        status = response.status_code
        content = response.json() if status // 100 == 2 else None
        cache = getattr(response, "from_cache", False)
    except RequestException as e:
        log.debug(e, exc_info=True)
        return _request_json(
            url, parameters, body, headers, cache, agent, reattempt - 1
        )
    except Exception as e:
        log.error(e, exc_info=True)
        if reattempt > 0:
            SESSION.cache.clear()
            return _request_json(
                url, parameters, body, headers, False, agent, 0
            )
    else:
        log.info("method: %s" % method)
        log.info("headers: %r" % headers)
        log.info("parameters: %r" % parameters)
        log.info("cache: %r" % cache)
        log.info("status: %d" % status)
        log.debug("content: %s" % content)
    finally:
        SESSION._is_cache_disabled = initial_cache_state

    return status, content