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

Flutter中如何用jwtDecoder解析JWT令牌并存入模型访问

如何将JWT解码数据存入自定义Login模型并访问数据

我正在使用jwtDecoder包解码JWT令牌,想要将令牌中的所有数据存入自定义Login模型,之后通过该模型访问数据,请提供指导。

现有代码

获取数据函数

fetchUserData() {
  Map<String, dynamic> decodedToken = JwtDecoder.decode(storedtoken!);
  Login.fromJson(decodedToken);
  loginFromJson(decodedToken);
  print(decodedToken["lastName"]);
}

模型代码

List<Login> loginFromJson(String str) =>
    List<Login>.from(json.decode(str).map((x) => Login.fromJson(x)));

String loginToJson(List<Login> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Login {
  Login({
    required this.id,
    required this.firstName,
    required this.lastName,
    required this.email,
  });

  String id;
  String firstName;
  String lastName;
  String email;

  factory Login.fromJson(Map<String, dynamic> json) => Login(
        id: json["_id"],
        firstName: json["firstName"],
        lastName: json["lastName"],
        email: json["email"],
      );

  Map<String, dynamic> toJson() => {
        "_id": id,
        "firstName": firstName,
        "lastName": lastName,
        "email": email,
      };
}

修正步骤及解决方案

  1. 移除无用的列表解析函数:loginFromJson是用来解析数组格式JSON的,但JWT解码后是单个用户的Map数据,这个函数完全用不上,可以直接删掉。

  2. 保存Login实例:原来的代码里Login.fromJson(decodedToken)只是创建了Login对象,但没赋值给变量,导致无法后续访问。需要把它赋值给类成员变量或局部变量。

  3. 处理空值安全:JWT payload里的字段可能为空,建议在fromJson里添加空值处理,避免运行时错误,比如用??设置默认空字符串。

修正后的获取数据函数

// 定义类成员变量保存用户数据
Login? currentUser;

fetchUserData() {
  Map<String, dynamic> decodedToken = JwtDecoder.decode(storedtoken!);
  // 创建Login实例并保存
  currentUser = Login.fromJson(decodedToken);
  // 通过模型访问数据
  print(currentUser?.lastName);
  print(currentUser?.email);
}

优化后的Login模型(增加空值处理)

class Login {
  Login({
    required this.id,
    required this.firstName,
    required this.lastName,
    required this.email,
  });

  String id;
  String firstName;
  String lastName;
  String email;

  factory Login.fromJson(Map<String, dynamic> json) => Login(
        id: json["_id"] ?? "",
        firstName: json["firstName"] ?? "",
        lastName: json["lastName"] ?? "",
        email: json["email"] ?? "",
      );

  Map<String, dynamic> toJson() => {
        "_id": id,
        "firstName": firstName,
        "lastName": lastName,
        "email": email,
      };
}

使用说明

现在你可以通过currentUser实例访问所有用户数据,比如currentUser?.firstName、currentUser?.id等,不需要再直接操作解码后的Map,代码更规范安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:24:47