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

Flutter:如何正确读取JSON字段?提取insertId类型不匹配报错如何解决

问题原因

触发报错的核心原因是int.parse()方法仅接收String类型的入参,但你调用接口返回的JSON数据中,insertId字段本身就是数字类型,经过jsonDecode解析后会被Dart自动识别为int类型,直接把int类型的值传入int.parse()就会触发int类型不是String类型的子类型的类型不匹配异常。

修复方案

根据后端返回的实际情况选择对应方案即可:

方案1:通用兼容写法(推荐,可兼容返回int/String两种场景)

不需要做强制字符串转换,先判断类型再处理,修改对应代码行:

// 原错误代码
// responsetag = int.parse(data["insertId"]);
// 替换为
responsetag = data["insertId"] is int 
    ? data["insertId"] as int 
    : int.parse(data["insertId"].toString());

方案2:确定后端永远返回int类型时使用

如果可以100%确认insertId返回值永远是数字类型,直接赋值即可:

responsetag = data["insertId"] as int;
额外代码优化建议

你的代码中同时使用了await和then嵌套,属于不必要的异步写法,可简化为更易读的写法,避免异步逻辑出错:

Future<int> saveUser(User user, String authToken) async {
  print(convert.json.encode(user.toJson()));
  int responsetag = 0;
  try {
    // 去掉then嵌套,直接用await接收返回值
    http.Response response = await http.post(
      Uri.parse(_navLinks.saveUser()),
      body: convert.json.encode(user.toJson()),
      headers: {
        "Accept": "application/json",
        "content-type": "application/json",
        HttpHeaders.authorizationHeader: "Bearer $authToken"
      },
    );
    final int statusCode = response.statusCode;
    print("RESPONSE: " + response.body);
    print("STATUS CODE: " + statusCode.toString());
    if (statusCode < 200 || statusCode > 400) {
      throw Exception("Error while fetching data");
    } else {
      Map<String, dynamic> data = convert.jsonDecode(response.body);
      // 使用修复后的赋值逻辑
      responsetag = data["insertId"] is int 
          ? data["insertId"] as int 
          : int.parse(data["insertId"].toString());
    }
    return responsetag;
  } catch (error) {
    rethrow;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:48:01