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

Dart解析JSON数组时检测指定Key是否存在并为模型字段设置默认值的解决方案

解决JSON解析时缺失字段的空指针问题

你提到的containsKey方法确实是解决这个问题的思路之一,不过在Dart里还有更简洁的写法来处理这种场景——结合Map的索引访问和空值合并运算符??,就能轻松为缺失的字段设置默认值。

核心修改:在模型的fromJson方法中处理缺失字段

问题出在Qrqc.fromJson里直接取json["productName"],当JSON对象没有这个key时会返回null,如果你的业务不希望productName为null,就可以在这里设置默认值。

方法1:使用空值合并运算符(推荐,代码更简洁)

直接在赋值时用??指定默认值,当json["productName"]为null(包括字段不存在的情况)时,自动使用默认值:

factory Qrqc.fromJson(Map<String, dynamic> json) {
  return Qrqc(
    id: json['id'],
    progress: json["progress"],
    role: json["role"],
    status: json["status"],
    title: json["title"],
    createdAt: json["detectedAt"],
    perimeterName: json["perimeterName"],
    typeID: json["typeID"],
    // 这里添加默认值,比如空字符串或者你需要的默认文本
    productName: json["productName"] ?? "",
  );
}

方法2:使用containsKey显式检查

如果你需要更明确的逻辑判断,可以用containsKey方法先检查字段是否存在,再决定赋值:

factory Qrqc.fromJson(Map<String, dynamic> json) {
  return Qrqc(
    id: json['id'],
    progress: json["progress"],
    role: json["role"],
    status: json["status"],
    title: json["title"],
    createdAt: json["detectedAt"],
    perimeterName: json["perimeterName"],
    typeID: json["typeID"],
    productName: json.containsKey("productName") ? json["productName"] : "",
  );
}

额外注意:你的toJson方法有个小错误

我注意到你的toJson方法里有一行写错了:

data['typeID'] = title;

这里应该是赋值typeID而不是title,否则会导致数据错误,修正后:

data['typeID'] = typeID;

为什么这样能解决问题?

当JSON响应中没有productName这个key时,json["productName"]会返回null,通过??或者containsKey的判断,我们可以将其替换为预设的默认值(比如空字符串),这样Qrqc对象的productName字段就永远不会是null(如果你设置了默认值),也就避免了后续使用时的空指针异常。

你的fetchMyQrqc服务代码不需要修改,因为解析逻辑已经封装在Qrqc.fromJson里了,所有数组中的对象都会自动应用这个处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:22:28