def respond_json(ctx, data, code = None, headers = [], json_dumps_default = None, jsonp = None):
    """Return a JSON response.

    This function is optimized for JSON following
    `Google JSON Style Guide <http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml>`_, but will handle
    any JSON except for HTTP errors.
    """
    if isinstance(data, collections.Mapping):
        # Remove null properties as recommended by Google JSON Style Guide.
        data = type(data)(
            (name, value)
            for name, value in data.iteritems()
            if value is not None
            )
        error = data.get('error')
        if isinstance(error, collections.Mapping):
            error = data['error'] = type(error)(
                (name, value)
                for name, value in error.iteritems()
                if value is not None
                )
    else:
        error = None
    if jsonp:
        content_type = 'application/javascript; charset=utf-8'
    else:
        content_type = 'application/json; charset=utf-8'
    if error:
        code = code or error['code']
        assert isinstance(code, int)
        response = webob.exc.status_map[code](headers = headers)
        response.content_type = content_type
        if code == 204:  # No content
            return response
        if error.get('code') is None:
            error['code'] = code
        if error.get('message') is None:
            title = errors_title.get(code)
            title = ctx._(title) if title is not None else response.status
            error['message'] = title
    else:
        response = ctx.req.response
        response.content_type = content_type
        if code is not None:
            response.status = code
        response.headers.update(headers)
    # try:
    #     text = json.dumps(data, encoding = 'utf-8', ensure_ascii = False, indent = 2)
    # except UnicodeDecodeError:
    #     text = json.dumps(data, ensure_ascii = True, indent = 2)

    if json_dumps_default is None:
        text = json.dumps(data)
    else:
        text = json.dumps(data, default = json_dumps_default)
    text = unicode(text)
    if jsonp:
        text = u'{0}({1})'.format(jsonp, text)
    response.text = text
    return response
def respond_json ( ctx , data , code = None , headers = [ ] , json_dumps_default = None , jsonp = None ) : if isinstance ( data , collections . Mapping ) : data = type ( data ) ( ( name , value ) for name , value in data . iteritems ( ) if value is not None ) error = data . get ( 'error' ) if isinstance ( error , collections . Mapping ) : error = data [ 'error' ] = type ( error ) ( ( name , value ) for name , value in error . iteritems ( ) if value is not None ) else : error = None if jsonp : content_type = 'application/javascript; charset=utf-8' else : content_type = 'application/json; charset=utf-8' if error : code = code or error [ 'code' ] assert isinstance ( code , int ) response = webob . exc . status_map [ code ] ( headers = headers ) response . content_type = content_type if code == 204 : return response if error . get ( 'code' ) is None : error [ 'code' ] = code if error . get ( 'message' ) is None : title = errors_title . get ( code ) title = ctx . _ ( title ) if title is not None else response . status error [ 'message' ] = title else : response = ctx . req . response response . content_type = content_type if code is not None : response . status = code response . headers . update ( headers ) if json_dumps_default is None : text = json . dumps ( data ) else : text = json . dumps ( data , default = json_dumps_default ) text = unicode ( text ) if jsonp : text = u'{0}({1})' . format ( jsonp , text ) response . text = text return response
Return a JSON response.

    This function is optimized for JSON following
    `Google JSON Style Guide <http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml>`_, but will handle
    any JSON except for HTTP errors.