如何将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
相关产品推荐
相关产品推荐

