代码之家  ›  专栏  ›  技术社区  ›  Clay

DRF不会将原始JSON字符串发送到浏览器。它返回一个JSON字符串,希望绕过调用json.load文件

  •  0
  • Clay  · 技术社区  · 8 年前

    与其解析JSON字符串然后对其进行解码,不如让它只返回JSON字符串本身?

    例如,是否有一种方法可以将其发送到前端:

    Response({ 'json': '{"example": "json-from-database"}' }, status=status.HTTP_200_OK)
    

    现在,这将创建一个不需要的JSON响应,如下所示:

    { 'json': '{"example": "json-from-database"}' }
    

    { 'json': {"example": "json-from-database"} }
    

    有没有一种方法可以将“原始”JSON响应发送到前端,而不必解析/解码现有的JSON字符串?

    目前我们正在使用 json.load .

    编辑、澄清:

    关于JSON。由于JSON已经有效,我只想返回字符串,让客户机使用它而不是Python来解析/解码它。

    2 回复  |  直到 8 年前
        1
  •  1
  •   rottweilers_anonymous    8 年前

    database_json = '{"from": ["the", "database"]}'
    raw_json = '{"json": {"example": %s}}' % database_json
    return HTTPResponse(raw_json, content_type='application/json')
    

    如果您需要对json的“json”和“example”部分进行一些验证/灵活性,那么这就有点困难了,您必须制作一个自定义编码器并对字符串进行monkey-patch转义(因为它将转义双引号):

    from contextlib import contextmanager
    import json
    
    class RawJSON(str):
      def __init__(self, raw_json):
        return super(RawJSON, self).__init__(raw_json)
    
    
    class JSONEncoderWithRawSupport(json.JSONEncoder):
      @contextmanager
      def patched_encoder(self):
        default_encoder = json.encoder.encode_basestring_ascii
    
        def _encode(o):
            if isinstance(o, RawJSON):
                return o
            return default_encoder(o)
        json.encoder.encode_basestring_ascii = _encode
        yield
        json.encoder.encode_basestring_ascii = default_encoder
    
      def iterencode(self, *args, **kwargs):
        with self.patched_encoder():
            return super(JSONEncoderWithRawSupport, self).iterencode(*args, **kwargs)     
    
    
    database_json = RawJSON('{"from": ["the", "database"]}')
    my_dict = {"json": {"example": database_json}}
    my_json = json.dumps(my_dict, cls=JSONEncoderWithRawSupport)
    return HTTPResponse(my_json, content_type='application/json')
    
        2
  •  1
  •   JPG    8 年前

    JSONField DRF序列化程序

    #serializer.py
    from rest_framework import serializers
    
    
    class Myserializer(serializers.Serializer):
        myjson = serializers.JSONField()
    
    
    #views.py
    class MyView(....):
        .....
        myjson = {"myjson":{some requeried json}}
        serializer = Myserializer(myjson)
        serializer.is_valid(True)
        return Response(data=serializer.data)