我们在数据库中存储了大量 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 尝试解析/解码它。
好的,您的问题有点令人困惑,但是请继续:“我做了一个编辑,这可能会澄清它。我只是不希望 Response 在传递给它的数据上运行它的编码器。我想要一个例外允许我返回一个“原始”JSON 字符串。”我认为您只是想跳过服务器端的解析计算?如果是这样的话:
database_json = '{"from": ["the", "database"]}'
raw_json = '{"json": {"example": %s}}' % database_json
return HTTPResponse(raw_json, content_type='application/json')
如果您需要对 JSON 的 'json' 和 'example' 部分进行一些验证/灵活性,那么它会有点困难,您必须制作自定义编码器并对字符串转义进行猴子补丁(因为它会转义双引号):
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')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句