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 尝试解析/解码它。

罗威纳犬_匿名

好的,您的问题有点令人困惑,但是请继续:“我做了一个编辑,这可能会澄清它。我只是不希望 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档