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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:17:36