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



我们在数据库中存储了大型JSON blob,我们希望使用DRF传递给前端。

与其解析该 JSON 字符串然后对其进行解码,我们可以让它只返回 JSON 字符串本身吗?

例如,有没有办法将其发送到前端:

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

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

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

我们希望它创建一个如下所示的 JSON 响应:

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

有没有办法将"原始"JSON响应发送到前端,而无需解析/解码我们现有的JSON字符串?

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

编辑、澄清:

客户端看到 JSON 响应,但它具有包含 JSON字符串的属性。 由于 JSON 已经有效,我只想返回字符串并让客户端使用而不是 Python 尝试解析/解码它。

好吧,你的问题有点令人困惑,但离开这个:"我做了一个编辑,这可能会澄清它。我只是不希望响应在传递给它的数据上运行它的编码器。我想要一个允许我返回"原始"JSON 字符串的例外。" 我认为您只是想跳过服务器端的解析计算?㞖:

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

如果您需要对 JSON 的"json"和"示例"部分进行一些验证/灵活性,那么它有点困难,您必须制作一个自定义编码器并对字符串进行猴子修补转义(因为它会转义双引号(。

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')

DRF 序列化程序
的使用JSONField

#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)

最新更新