You need to enable JavaScript to run this app. 如何在DRF序列化器中将存储JSON的文本字段解析为标准JSON直接输出
优惠活动
大模型
产品
解决方案
定价
更多

如何在DRF序列化器中将存储JSON的文本字段解析为标准JSON直接输出

问题根源

当前序列化器将details字段按普通字符串类型直接返回,未对文本字段中存储的JSON内容做解析,最终输出的结果是带转义符的字符串,前端需要额外做转义、解析操作才能拿到结构化数据,不符合接口直接返回规整JSON的要求。

最简洁实现方案

由于仅需支持读取操作、无需实现写入逻辑,直接使用DRF内置的SerializerMethodField即可,完全匹配直接调用json.loads完成解析的实现思路,不需要编写自定义字段、不需要改动模型层存储逻辑,是最小改动量的实现路径。

调整后的序列化器代码

import json
from rest_framework import serializers
from .models import SomeModel

class SomeSerializer(serializers.ModelSerializer):
    details = serializers.SerializerMethodField()

    class Meta:
        model = SomeModel
        fields = ("id", "details")

    def get_details(self, obj):
        raw_text = obj.details
        # 空值场景直接返回,避免无意义的解析开销
        if not raw_text:
            return None
        # 捕获解析异常,兜底处理第三方应用写入的格式不合法的脏数据
        try:
            return json.loads(raw_text)
        except json.JSONDecodeError:
            return raw_text

改造后的接口返回效果

直接输出结构化嵌套JSON,不存在转义字符串,前端可直接读取使用:

[
  {
    "id": "someID",
    "details": {
      "address": {
        "city": null
      }
    }
  }
]
关键注意事项
  • SerializerMethodField天生为只读属性,不需要额外配置read_only=True,也不需要适配写入逻辑,完全匹配当前仅需读操作的需求
  • 不要为了该场景随意改动模型字段类型、引入自定义JSON字段类,现有文本字段的存储逻辑完全不需要调整,避免引入额外的冗余代码
  • 必须增加解析异常捕获逻辑,第三方应用存储的文本内容可能存在格式不合法的情况,无容错的解析逻辑会直接触发接口500错误,影响线上可用性

内容的提问来源于stack exchange,提问作者ambe5960

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 12:45:03