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

Flutter/Dart如何反序列化包含字符串与字符串列表的JSON数据

问题根源

反序列化失败的核心原因是实体类字段类型和接口返回的JSON结构不匹配:你将TemplateArguments定义为List<String>类型,但根据你描述的接口返回规则(一类为字符串键值对,另一类为字符串键对应字符串数组值),该字段实际结构为Map<String, List<String>>,直接做强制类型转换必然触发类型错误。
此外Dart的类型安全校验比你熟悉的C#更严格,json.decode返回的集合默认元素类型为dynamic,即使字段结构和预期一致,也不能直接将List<dynamic>强转为List<String>,必须做元素级转换。

修复方案

1. 修正实体类序列化逻辑

替换原有实体类代码,补全类型转换逻辑,同时增加空值兜底避免字段缺失时崩溃:

class TemplateContentAndArgumentsObject {
  String TemplateContent;
  Map<String, List<String>> TemplateArguments;

  TemplateContentAndArgumentsObject({
    required this.TemplateContent,
    required this.TemplateArguments,
  });

  factory TemplateContentAndArgumentsObject.fromJson(
    Map<String, dynamic> json,
  ) {
    // 处理参数映射的类型转换
    final rawArgMap = json["TemplateArguments"] as Map<String, dynamic>? ?? {};
    final parsedArgMap = rawArgMap.map((key, dynamic value) {
      // 数组内元素逐个转String,兼容不同类型的返回值
      final argList = (value as List<dynamic>?)
              ?.map((item) => item.toString())
              .toList() ??
          <String>[];
      return MapEntry(key, argList);
    });

    return TemplateContentAndArgumentsObject(
      TemplateContent: json["TemplateContent"] as String? ?? "",
      TemplateArguments: parsedArgMap,
    );
  }
}

2. 修正接口调用的默认返回值

原有默认返回值中TemplateArguments为列表类型,和修正后的字段类型不匹配,替换为对应Map类型的空实例即可:

// 接口请求失败时的兜底返回
return TemplateContentAndArgumentsObject(
    TemplateContent: "",
    TemplateArguments: <String, List<String>>{}
);
补充说明
  • 你在请求头中添加的Access-Control-Allow-Origin属于CORS响应头,放在前端请求头中无任何效果。本地调试遇到跨域问题时,直接在.NET后端的CORS配置中添加本地调试端口的允许规则即可。
  • 后续如果JSON结构更复杂,不想手动编写序列化逻辑,可以使用json_serializable做代码生成,使用逻辑和C#生态中的System.Text.Json源生成器基本一致,能减少手动写类型转换的出错概率。
  • Dart中泛型类型的强转要求和C#存在差异:C#中可以直接将元素为string类型的List<object>强转为List<string>,但Dart中List<dynamic>和List<String>是完全不同的运行时类型,必须通过map遍历做元素转换,否则会抛出类型转换异常。

内容的提问来源于stack exchange,提问作者ThisQRequiresASpecialist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:12:21