如何正确获取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
相关产品推荐
相关产品推荐

