'GETs some json from the given host homeserver and path
Args:
destination (str): The remote server to send the HTTP request
to.
path (str): The HTTP path.
args (dict): A dictionary used to create query strings, defaults to
None.
timeout (int): How long to try (in ms) the destination for before
giving up. None indicates no timeout and that the request will
be retried.
ignore_backoff (bool): true to ignore the historical backoff data
and try the request anyway.
Returns:
Deferred: Succeeds when we get a 2xx HTTP response. The result
will be the decoded JSON body.
Fails with ``HTTPRequestException`` if we get an HTTP response
code >= 300.
Fails with ``NotRetryingDestination`` if we are not yet ready
to retry this server.'

@defer.inlineCallbacks
def get_json(self, destination, path, args={}, retry_on_dns_fail=True, timeout=None, ignore_backoff=False):

    logger.debug('get_json    args:    %s', args)
    encoded_args = {}
    for (k, vs) in args.items():
        if isinstance(vs, basestring):
            vs = [vs]
        encoded_args[k] = [v.encode('UTF-8') for v in vs]
    query_bytes = urllib.urlencode(encoded_args, True)
    logger.debug('Query    bytes:    %s    Retry    DNS:    %s', args, retry_on_dns_fail)
    def body_callback(method, url_bytes, headers_dict):
        self.sign_request(destination, method, url_bytes, headers_dict)
        return None
    response = (yield self._request(destination, 'GET', path, query_bytes=query_bytes, body_callback=body_callback, retry_on_dns_fail=retry_on_dns_fail, timeout=timeout, ignore_backoff=ignore_backoff))
    if (200 <= response.code < 300):
        check_content_type_is_json(response.headers)
    with logcontext.PreserveLoggingContext():
        body = (yield readBody(response))
    defer.returnValue(json.loads(body))
