Flutter序列化长对象列表时jsonEncode生成的JSON字符串被截断
长列表转JSON字符串被截断的解决方案
问题分析
从你提供的截断JSON示例来看,不仅存在字符串截断,还出现了JSON格式错误(adminId后直接跟对象,缺少activityBookList键对应的数组结构),这可能是手动实现toJson时的逻辑问题,或是打印长文本时的系统限制导致。
具体解决步骤
1. 排查是否为打印显示截断
Flutter/Dart的默认print函数对长字符串有长度限制,会自动截断输出。可以改用以下方式完整打印:
import 'dart:convert'; // 将对象转换为JSON字符串 String jsonString = jsonEncode(yourActivityBookingRequest.toJson()); // 方法1:使用debugPrint(Flutter环境) debugPrint(jsonString); // 方法2:分段打印长字符串 final segmentPattern = RegExp('.{1,800}'); // 每800字符分一段 segmentPattern.allMatches(jsonString).forEach((match) => print(match.group(0)));
2. 修复手动toJson的潜在问题
你的主模型ActivityBookingRequest的toJson方法存在两个隐患:
- 返回的
Map未指定泛型类型,可能导致序列化异常 - 键名
activityBookList与变量名activityBookingList不一致,可能是笔误(示例JSON中未出现该键,直接出现子对象,说明结构错误)
修改后的主模型toJson:
Map<String, dynamic> toJson() { List<Map<String, dynamic>>? activityBookingListMap = this.activityBookingList != null ? this.activityBookingList.map((i) => i.toJson()).toList() : null; return { 'adminId': adminId, 'activityBookingList': activityBookingListMap, // 修正键名与变量名一致 }; }
3. 推荐使用自动序列化工具(避免手动错误)
手动编写toJson容易出错,推荐使用json_serializable包自动生成序列化代码:
步骤1:添加依赖
在pubspec.yaml中添加:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
步骤2:修改模型类
import 'package:json_annotation/json_annotation.dart'; part 'activity_booking.g.dart'; @JsonSerializable() class ActivityBookingRequest { int adminId; List<ActivityBookingDetail>? activityBookingList; ActivityBookingRequest({required this.adminId, this.activityBookingList}); factory ActivityBookingRequest.fromJson(Map<String, dynamic> json) => _$ActivityBookingRequestFromJson(json); Map<String, dynamic> toJson() => _$ActivityBookingRequestToJson(this); } @JsonSerializable() class ActivityBookingDetail { int bookingId; int resourceId; int sourceId; String sourceName; int productId; String pickupDate; String cutOffDate; int adultNumber; int childrenNumber; ActivityBookingDetail( this.bookingId, this.resourceId, this.sourceId, this.sourceName, this.productId, this.pickupDate, this.cutOffDate, this.adultNumber, this.childrenNumber, ); factory ActivityBookingDetail.fromJson(Map<String, dynamic> json) => _$ActivityBookingDetailFromJson(json); Map<String, dynamic> toJson() => _$ActivityBookingDetailToJson(this); }
步骤3:生成序列化代码
在终端运行命令:
flutter pub run build_runner build
自动生成的代码会处理所有序列化逻辑,避免手动编写的错误,同时保证长列表序列化的完整性。
内容的提问来源于stack exchange,提问作者Sumanth Shankar
相关产品推荐
相关产品推荐

