'Sends the specifed json data using POST
Args:
destination (str): The remote server to send the HTTP request
to.
path (str): The HTTP path.
data (dict): A dict containing the data that will be used as
the request body. This will be encoded as JSON.
long_retries (bool): A boolean that indicates whether we should
retry for a short or long time.
timeout(int): How long to try (in ms) the destination for before
giving up. None indicates no timeout.
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 post_json(self, destination, path, data={}, long_retries=False, timeout=None, ignore_backoff=False):

    def body_callback(method, url_bytes, headers_dict):
        self.sign_request(destination, method, url_bytes, headers_dict, data)
        return _JsonProducer(data)
    response = (yield self._request(destination, 'POST', path, body_callback=body_callback, headers_dict={'Content-Type': ['application/json']}, long_retries=long_retries, 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))
