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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:35:44