Python Django后端返回JSON字符串,Angular前端解析报错求助
解决思路:Angular 5 + Django REST Framework 数组响应报错问题
嘿,我之前碰到过几乎一模一样的问题,咱们来一步步搞定它!
首先得搞懂为啥会报错:你看到的 Error trying to diff '["Cat", "Dog"]'. Only arrays and iterables are allowed,本质是前端拿到的不是真正的数组,而是一个被字符串包裹的JSON数组(就是你说的返回内容 "["Cat", "Dog"]")。Angular尝试对这个字符串做迭代或者差异比较时,自然会报错——毕竟字符串可不是可迭代的数组类型。
下面分两种方案解决,优先推荐后端修复,因为这才是问题的根源:
一、后端(Django REST Framework)根源修复
大概率是你在代码里手动把数组转成了JSON字符串,没让DRF自动处理序列化。DRF本来就可以把Python列表直接转成JSON数组,完全不需要额外手动转码。
检查你的视图/序列化器代码,去掉多余的
json.dumps()操作:
错误示例(手动转成字符串导致返回异常):from django.http import JsonResponse import json def pet_list(request): pets = ["Cat", "Dog"] # 错误:手动把数组转成了JSON字符串,返回给前端的是字符串而非数组 return JsonResponse({"data": json.dumps(pets)})正确示例(让DRF自动处理序列化):
from django.http import JsonResponse def pet_list(request): pets = ["Cat", "Dog"] # 直接返回Python列表,DRF会自动转成JSON数组 return JsonResponse({"data": pets}, safe=False) # 如果用DRF的APIView,直接return Response(pets)即可如果你用了DRF序列化器,确保字段类型正确:
from rest_framework import serializers class PetSerializer(serializers.Serializer): # 用ListField处理数组类型,而非CharField存JSON字符串 pets = serializers.ListField(child=serializers.CharField())
二、前端(Angular 5)临时 workaround
如果暂时没法修改后端,可以在前端把拿到的字符串解析成真正的数组:
假设后端返回的字段是
pets,值是字符串形式的数组,在组件/服务里解析:this.http.get('/api/pet-list').subscribe((res: any) => { // 把字符串解析成数组 this.pets = JSON.parse(res.pets); // 现在就可以正常用*ngFor或者其他迭代逻辑了 });如果后端直接返回的就是这个字符串(而非嵌套在对象里),要指定响应类型为文本再解析:
this.http.get('/api/pet-list', { responseType: 'text' }).subscribe((res: string) => { this.pets = JSON.parse(res); });
最后提醒下:优先修复后端,让后端返回标准的JSON数组才是规范做法,前端解析只是临时应急的手段。
内容的提问来源于stack exchange,提问作者Lior Alon
相关产品推荐
相关产品推荐

