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

如何正确获取NodeJS API返回的GetUserResponseModel中的Payments数组?

解决Dart中获取API返回的Payments数组打印异常问题

问题描述

我需要从NodeJS API返回的GetUserResponseModel中获取payments数组,当前使用的代码如下:

List? payments
Future getCurrentUser() async {
  var loginDetails = await SharedService.loginDetails();
  email = loginDetails?.data.email;
  GetUserRequestModel model = GetUserRequestModel(email: email!);

  var currentUserInfo = await APIService.getUserInfo(model);
  balance = currentUserInfo.data?.balance;
  payments = currentUserInfo.data?.payments; // 打印结果不符合预期
  print(payments)
}

目前currentUserInfo能正常获取其他所有数据,但payments赋值后,print(payments)输出为Instance of payments,求正确的获取和打印方法。

附相关代码

GetUserResponseModel代码

import 'dart:convert';

GetUserResponseModel getUserResponseModelJSON(String str) =>
    GetUserResponseModel.fromJson(json.decode(str));

class GetUserResponseModel {
  GetUserResponseModel({
    required this.message,
    required this.data,
  });
  late final String message;
  late final Data? data;

  GetUserResponseModel.fromJson(Map<String, dynamic> json) {
    message = json['message'];
    data = (json['data'] != null ? Data.fromJson(json['data']) : null);
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['message'] = message;
    _data['data'] = data?.toJson();
    return _data;
  }
}

class Data {
  Data({
    required this.username,
    required this.email,
    required this.balance,
    required this.date,
    required this.payments,
    required this.id,
  });
  late final String username;
  late final String email;
  late final int balance;
  late final String date;
  late final List<Payments> payments;
  late final String id;

  Data.fromJson(Map<String, dynamic> json) {
    username = json['username'];
    email = json['email'];
    balance = json['balance'];
    date = json['date'];
    payments =
        List.from(json['payments']).map((e) => Payments.fromJson(e)).toList();
    id = json['id'];
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['username'] = username;
    _data['email'] = email;
    _data['balance'] = balance;
    _data['date'] = date;
    _data['payments'] = payments.map((e) => e.toJson()).toList();
    _data['id'] = id;
    return _data;
  }
}

class Payments {
  Payments({
    required this.paymentCost,
    required this.paymentDate,
    required this.id,
  });
  late final int paymentCost;
  late final String paymentDate;
  late final String id;

  Payments.fromJson(Map<String, dynamic> json) {
    paymentCost = json['paymentCost'];
    paymentDate = json['paymentDate'];
    id = json['_id'];
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['paymentCost'] = paymentCost;
    _data['paymentDate'] = paymentDate;
    _data['_id'] = id;
    return _data;
  }
}

getUserInfo方法代码

static Future<GetUserResponseModel> getUserInfo(
    GetUserRequestModel model) async {
  var loginDetails = await SharedService.loginDetails();

  Map<String, String> requestHeaders = {
    'Content-Type': 'application/json',
    'Authorization': 'Basic ${loginDetails!.data.token}'
  };
  var url = Uri.http(Config.apiURL, Config.getUserInfoAPI);
  var response = await client.post(
    url,
    headers: requestHeaders,
    body: jsonEncode(model.toJson()),
  );

  return getUserResponseModelJSON(response.body);
}

解决方案

1. 本质问题说明

你看到的Instance of payments并不是获取失败,而是Dart默认打印对象时,只会输出对象的类型名称,不会展示内部属性。实际上payments数组已经正确完成赋值。

2. 正确打印数组内容的三种方式

方式一:遍历数组打印单个对象属性

修改打印逻辑,逐个输出Payments对象的具体字段:

payments?.forEach((payment) {
  print('支付金额: ${payment.paymentCost}, 支付日期: ${payment.paymentDate}, ID: ${payment.id}');
});

方式二:给Payments类重写toString()方法

在Payments类中添加自定义的toString()方法,直接打印对象时会输出指定内容:

class Payments {
  // 原有代码不变...

  @override
  String toString() {
    return 'Payments(paymentCost: $paymentCost, paymentDate: $paymentDate, id: $id)';
  }
}

修改后直接执行print(payments),就能看到每个Payments对象的详细信息。

方式三:转为JSON字符串打印

利用已实现的toJson()方法,将数组转成JSON格式输出:

print(jsonEncode(payments?.map((p) => p.toJson()).toList()));

3. 优化变量类型(推荐)

原代码中List? payments未指定泛型类型,建议改为List<Payments>? payments,获得更严格的类型检查和代码提示:

List<Payments>? payments; // 修正后的变量声明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:15:37