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

Flutter http.get请求解析JSON数据返回null如何解决

Flutter网络请求解析后email字段为null问题排查

问题现象

使用Dart编写Flutter网络请求逻辑时,需要在Widget中展示接口返回的用户邮箱,但打印解析后的数据时email字段始终为null,无法定位错误来源。

问题相关代码

Modelclass.dart

int? page;
int? perPage;
int? total;
int? totalPages;
List<Data>? data;
Support? support;

Modelclass(
    {this.page,
    this.perPage,
    this.total,
    this.totalPages,
    this.data,
    this.support});

Modelclass.fromJson(Map<String, dynamic> json) {
  page = json['page'];
  perPage = json['per_page'];
  total = json['total'];
  totalPages = json['total_pages'];
  if (json['data'] != null) {
    data = <Data>[];
    json['data'].forEach((v) {
      data!.add(new Data.fromJson(v));
    });
  }
  support =
      json['support'] != null ? new Support.fromJson(json['support']) : null;
}

Map<String, dynamic> toJson() {
  final Map<String, dynamic> data = new Map<String, dynamic>();
  data['page'] = this.page;
  data['per_page'] = this.perPage;
  data['total'] = this.total;
  data['total_pages'] = this.totalPages;
  if (this.data != null) {
    data['data'] = this.data!.map((v) => v.toJson()).toList();
  }
  if (this.support != null) {
    data['support'] = this.support!.toJson();
  }
  return data;
}
}

class Data {
int? id;
String? email;
String? firstName;
String? lastName;
String? avatar;

Data({this.id, this.email, this.firstName, this.lastName, this.avatar});

Data.fromJson(Map<String, dynamic> json) {
  id = json['id'];
  email = json['email'];
  firstName = json['first_name'];
  lastName = json['last_name'];
  avatar = json['avatar'];
}

Map<String, dynamic> toJson() {
  final Map<String, dynamic> data = new Map<String, dynamic>();
  data['id'] = this.id;
  data['email'] = this.email;
  data['first_name'] = this.firstName;
  data['last_name'] = this.lastName;
  data['avatar'] = this.avatar;
  return data;
}
}

class Support {
String? url;
String? text;

Support({this.url, this.text});

Support.fromJson(Map<String, dynamic> json) {
  url = json['url'];
  text = json['text'];
}

Map<String, dynamic> toJson() {
  final Map<String, dynamic> data = new Map<String, dynamic>();
  data['url'] = this.url;
  data['text'] = this.text;
  return data;
}
}

Repository.dart

import 'package:http/http.dart' as http;
import 'package:neww/Model/Modelclass.dart';
import 'package:neww/Model/model2.dart';

const url = 'https://reqres.in/api/users/';

class Repository {
Future<Data?> getdata() async {
  final result = await http.get(Uri.parse(url));
  if (result.statusCode != 200) {
    return null;
  }
  final decodeddata = jsonDecode(result.body);

  final neww = Data.fromJson(decodeddata);
  print(neww.email);

  return neww;
}
}

问题根因

调用的reqres接口返回的最外层结构对应定义的Modelclass,email字段存储在最外层data字段对应的数组内,每个数组元素才是Data类型的用户对象。当前代码直接将最外层解码结果传入Data.fromJson(),最外层结构本身不存在email、first_name这类用户属性字段,解析时无法匹配到对应键值,因此打印email结果始终为null。
额外注意:当前代码使用jsonDecode但未导入dart:convert包,运行时也会触发报错,需要补充导入。

修复参考

调整Repository中的解析逻辑,先解析最外层结构为Modelclass对象,再从其data列表中取出用户对象,即可正常获取email字段值,修复后代码参考:

// 补充缺失的convert包导入
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:neww/Model/Modelclass.dart';

const url = 'https://reqres.in/api/users/';

class Repository {
  // 根据业务需求调整返回值类型,需要用户列表就返回List<Data>?
  Future<List<Data>?> getdata() async {
    final result = await http.get(Uri.parse(url));
    if (result.statusCode != 200) {
      return null;
    }
    final decodeddata = jsonDecode(result.body);
    // 先解析最外层响应结构
    final responseModel = Modelclass.fromJson(decodeddata);
    // 从data列表中取对应用户数据,例如取第一个用户邮箱可通过responseModel.data?.first.email获取
    print(responseModel.data?.first.email);

    return responseModel.data;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:22:01