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

Flutter中JSON属性名与键名能否不同?配置文件序列化问题求助

解决方案

要实现configFile字段以{文件名: Base64文件数据}的嵌套结构传输,核心是在序列化ReportNonCompliancePosition类时,给configFile键赋值一个嵌套Map。以下是具体实现方式:

1. 手动实现序列化(无第三方库)

如果是手动编写toJson方法,直接构造符合要求的Map结构即可:

class ReportNonCompliancePosition {
  String? fileName;
  String? fileBase64;
  // 其他字段
  String? positionDesc;

  ReportNonCompliancePosition({
    this.fileName,
    this.fileBase64,
    this.positionDesc,
  });

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> jsonData = {};
    // 添加其他字段
    if (positionDesc != null) jsonData['positionDesc'] = positionDesc;
    // 构造configFile的嵌套结构
    if (fileName != null && fileBase64 != null) {
      jsonData['configFile'] = {
        fileName!: fileBase64!,
      };
    }
    return jsonData;
  }
}

序列化后生成的JSON结构示例:

{
  "positionDesc": "违规位置描述",
  "configFile": {
    "example.pdf": "JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndG..."
  }
}

2. 使用json_serializable库的实现

如果项目依赖json_serializable,可以通过自定义序列化逻辑实现:

import 'package:json_annotation/json_annotation.dart';

part 'report_non_compliance_position.g.dart';

@JsonSerializable()
class ReportNonCompliancePosition {
  @JsonKey(ignore: true) // 忽略自动序列化该字段
  String? fileName;
  @JsonKey(ignore: true) // 忽略自动序列化该字段
  String? fileBase64;
  String? positionDesc;

  ReportNonCompliancePosition({
    this.fileName,
    this.fileBase64,
    this.positionDesc,
  });

  factory ReportNonCompliancePosition.fromJson(Map<String, dynamic> json) =>
      _$ReportNonCompliancePositionFromJson(json);

  Map<String, dynamic> toJson() {
    final baseJson = _$ReportNonCompliancePositionToJson(this);
    // 添加configFile嵌套结构
    if (fileName != null && fileBase64 != null) {
      baseJson['configFile'] = {fileName!: fileBase64!};
    }
    return baseJson;
  }
}

执行代码生成命令后(flutter pub run build_runner build),即可自动生成符合要求的序列化逻辑。

关键注意点

  • 确保fileName和fileBase64不为空时才添加configFile字段,避免传输无效数据
  • 不要将文件名直接作为外层Map的键,而是嵌套在configFile对应的Map中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:20