我正在使用Django Rest Framework 2.4,并且在序列化器中我有这段代码
def validate_fields(self, attrs, source):
print(attrs)
fields = json.loads(attrs[source])
我不断收到错误说:没有JSON对象可以被解码。调用validate_fields
但是将fields
作为字符串而不是Python字符串列表。
我目前正在
{"fields": '["a", "b", "c"]'}
当我想接收这个时,我发送的是
{"fields": ["a", "b", "c"]}
答案 0 :(得分:0)
Django REST Framework为您处理JSON解码。
attrs
的输出有意义:它是一个包含带字符串值的Python列表的Python字典。没有必要对此进行进一步解码,因为Django REST Framework在接收请求时已经为您完成了此操作。
您现在可以使用attrs[source]
的值,它的格式与您期望的格式相同。您可能一直在期待整数列表(不是字符串整数),在这种情况下,您可以对列表进行后处理并使用int
进行映射。如果不是,attrs
的输出将如下所示:
{"fields": '["1", "2", "3"]'}
注意新引号。这意味着Django REST Framework无法读取JSON数据,因此它将它作为字符串提供给您。这也可能意味着它并不知道将其作为列表读取,在这种情况下,请继续阅读以找到第二种可能的解决方案。
另外,请确保序列化工具上的fields
字段设置为many=True
或in a ListField
。
class ExampleSerializer(serializers.Serializer):
fields = serializers.ListField(child=serializers.CharField())
这可以解释为什么Python列表被强制转换为字符串,这可以解释为什么它不能被解析,因为Python列表不能与JSON列表完美匹配。