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
相关产品推荐
相关产品推荐

