尝试将JSON数组转换为Python列表时,json.loads抛出错误

时间:2014-12-17 16:39:25

标签: python django django-rest-framework

我正在使用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"]}

enter image description here

1 个答案:

答案 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=Truein a ListField

class ExampleSerializer(serializers.Serializer):
    fields = serializers.ListField(child=serializers.CharField())

这可以解释为什么Python列表被强制转换为字符串,这可以解释为什么它不能被解析,因为Python列表不能与JSON列表完美匹配。