You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django TextField中的字符串转换为JSON格式?

解决方案

方法1:使用ast.literal_eval替代json.loads

因为存储的字符串是Python字面量格式(单引号包裹元素),而非标准JSON,json.loads无法解析,但ast.literal_eval可以安全地解析Python的字面量结构,包括这种单引号列表:

修改to_dict方法:

import ast

def to_dict(self):
    result = dict()
    result['data'] = ast.literal_eval(self.data)
    return result

ast.literal_eval比原生eval更安全,不会执行恶意代码,完全适配这种场景。

方法2:在序列化阶段存入标准JSON格式

从根源解决问题,修改序列化器,在保存时将列表转为标准JSON字符串,后续读取直接用json.loads即可:

更新CarSerializer,重写to_internal_value方法:

import json

class CarSerializer(serializers.ModelSerializer):
    data = serializers.ListField(child=serializers.CharField())

    def to_internal_value(self, data):
        # 先调用父类获取处理后的数据
        internal_data = super().to_internal_value(data)
        # 将列表转为标准JSON字符串存入数据库
        internal_data['data'] = json.dumps(internal_data['data'])
        return internal_data

这样数据库中的data字段会是标准双引号JSON格式,后续json.loads(self.data)不会再报错。

方法3:兼容新旧数据的容错处理

如果数据库中已经存在旧的单引号格式数据,同时要支持新的标准JSON格式,可以做容错解析:

import json
import ast

def to_dict(self):
    result = dict()
    try:
        # 优先尝试标准JSON解析
        result['data'] = json.loads(self.data)
    except json.JSONDecodeError:
        # 解析失败则用ast处理Python字面量格式
        result['data'] = ast.literal_eval(self.data)
    return result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:14