jsonflutterjson-serializable

Property name and key name in JSON can be different in Flutter?


I am facing an issue in my code. I am sending an object "report" which has nested classes such as this one called 'non conformities'. Inside this I am sending some files. At moment I am sending only bytes but I want to add the filename to it.

enter image description here

Now the key is actually showing the filename but the name of the property (the one next to map entry) it is showing also the filename when it should show 'configFile'. My question is: is it possible to show a different name for the map entry and the key? So what I want should be:

13 = {map entry} 'configFile' ->
key = dummy.pdf
value = (the value showed in the picture)

this is my code:

@JsonSerializable(explicitToJson: true)
class ReportNonCompliancePosition {
  ReportNonCompliancePosition({
    this.uuid,
    this.fault,
    this.location,
    this.mainFailure,
    this.secondaryFailure, //THIS GET FROM CLASS CODEGORUP
    this.description,
    this.distributionChannel,
    this.fuseStatus, //ASK TO MARIAM
    this.matnr,
    this.configFile, //BASE64
    this.sdFile,
    this.blackBoxFile,
    this.layoutPlantFile,
    this.images,
  });

  final String? uuid;
  final ReportNonComplianceFault? fault;
  final ReportNonComplianceLocation? location;
  final ReportNonComplianceMainFailure? mainFailure;
  final ReportNonComplianceSecondaryFailure? secondaryFailure;
  final String? description;
  final String? distributionChannel;
  final String? fuseStatus;
  final String? matnr;
  final String? configFile;
  final String? sdFile;
  final String? blackBoxFile;
  final String? layoutPlantFile;
  final List<String>? images;

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

  bool get isAssembly => fault?.code == '0001';

  Map<String, dynamic> toJson() => _$ReportNonCompliancePositionToJson(this);

  Future<Map<String, dynamic>> toReportToJson() async {
    final fileHandler = Locator.get<IFileHandler>();

    //CONVERT IMAGES TO BASE64
    final configFileInBase64 = await fileHandler.getFilesInBase64(fileNames: [configFile]);
    final sdFileInBase64 = await fileHandler.getFilesInBase64(fileNames: [sdFile]);
    final blackBoxFileInBase64 = await fileHandler.getFilesInBase64(fileNames: [blackBoxFile]);
    final layoutPlantFileInBase64 = await fileHandler.getFilesInBase64(fileNames: [layoutPlantFile]);
    final imagesInBase64 = await fileHandler.getFilesInBase64(fileNames: images ?? []);

    final configFileSplit = configFile?.split('/');
    final configFileWithExtension =
    configFileSplit != null && configFileSplit.isNotEmpty ? configFileSplit.last : null;

    final jsonData = {
      'uuid': uuid ?? '',
      'fault': fault?.reportToJson() ?? {},
      'location': location?.reportToJson() ?? {},
      'mainFailure': mainFailure?.reportToJson() ?? {},
      'secondaryFailure': secondaryFailure?.reportToJson() ?? {},
      'description': description ?? '',
      'distributionChannel': distributionChannel ?? '',
      'fuseStatus': fuseStatus ?? '',
      'matnr': matnr ?? '',
      'sdFile': sdFileInBase64.firstOrNull,
      'blackBoxFile': blackBoxFileInBase64.firstOrNull,
      'layoutPlantFile': layoutPlantFileInBase64.firstOrNull,
      'images': imagesInBase64
    };

    // Add configFile with dynamic key if it exists
    if (configFileWithExtension != null) {
      final configFileMap = configFileInBase64.firstOrNull;
      jsonData[configFileWithExtension] = configFileMap;
    }

    return jsonData;
  }
  ReportNonCompliancePosition copyWith({
    String? uuid,
    ReportNonComplianceFault? fault,
    ReportNonComplianceLocation? location,
    ReportNonComplianceMainFailure? mainFailure,
    ReportNonComplianceSecondaryFailure? secondaryFailure,
    String? description,
    String? distributionChannel,
    String? fuseStatus,
    String? matnr,
    String? configFile,
    String? sdFile,
    String? blackBoxFile,
    String? layoutPlantFile,
    List<String>? images,
    bool force = false,
    bool forceMaterial = false,
  }) {
    return ReportNonCompliancePosition(
      uuid: uuid ?? this.uuid,
      fault: fault ?? this.fault,
      location: force ? location : (location ?? this.location),
      mainFailure: force ? mainFailure : (mainFailure ?? this.mainFailure),
      secondaryFailure: force ? secondaryFailure : (secondaryFailure ?? this.secondaryFailure),
      description: description ?? this.description,
      distributionChannel: distributionChannel ?? this.distributionChannel,
      fuseStatus: fuseStatus ?? this.fuseStatus,
      matnr: forceMaterial ? matnr : (matnr ?? this.matnr),
      configFile: configFile ?? this.configFile,
      sdFile: sdFile ?? this.sdFile,
      blackBoxFile: blackBoxFile ?? this.blackBoxFile,
      layoutPlantFile: layoutPlantFile ?? this.layoutPlantFile,
      images: images ?? this.images,
    );
  }

  ReportNonCompliancePosition deleteFiles({
    bool configFile = false,
    bool sdFile = false,
    bool blackBoxFile = false,
    bool layoutPlantFile = false,
  }) {
    return ReportNonCompliancePosition(
      uuid: uuid,
      fault: fault,
      location: location,
      mainFailure: mainFailure,
      secondaryFailure: secondaryFailure,
      description: description,
      distributionChannel: distributionChannel,
      fuseStatus: fuseStatus,
      matnr: matnr,
      configFile: configFile ? null : this.configFile,
      sdFile: sdFile ? null : this.sdFile,
      blackBoxFile: blackBoxFile ? null : this.blackBoxFile,
      layoutPlantFile: layoutPlantFile ? null : this.layoutPlantFile,
      images: images,
    );
  }

  ReportNonCompliancePosition deleteSecondaryFailure() {
    return ReportNonCompliancePosition(
      uuid: uuid,
      fault: fault,
      location: location,
      mainFailure: mainFailure,
      secondaryFailure: null,
      description: description,
      distributionChannel: distributionChannel,
      fuseStatus: fuseStatus,
      matnr: matnr,
      configFile: configFile,
      sdFile: sdFile,
      blackBoxFile: blackBoxFile,
      layoutPlantFile: layoutPlantFile,
      images: images,
    );
  }
}

In this part of the code

if (configFileWithExtension != null) {
          final configFileMap = configFileInBase64.firstOrNull;
          jsonData[configFileWithExtension] = configFileMap;
        }
    
        return jsonData;
      }

I have also tried to put

jsonData['configFile'] = configFileMap

but this way it shows 'configfile' both after map entry and for the key.

Can someone help me with this?

Thanks!!


Solution

  • Not sure if I understand but I think you want

    jsonData['configFile'] = {configFileWithExtension: configFileMap};
    

    By the way, Dart allows for if conditions inside the initialisation of the map. You could do this for example:

    final jsonData = {
      'uuid': uuid ?? '',
      'fault': fault?.reportToJson() ?? {},
      'location': location?.reportToJson() ?? {},
      'mainFailure': mainFailure?.reportToJson() ?? {},
      'secondaryFailure': secondaryFailure?.reportToJson() ?? {},
      'description': description ?? '',
      'distributionChannel': distributionChannel ?? '',
      'fuseStatus': fuseStatus ?? '',
      'matnr': matnr ?? '',
      'sdFile': sdFileInBase64.firstOrNull,
      'blackBoxFile': blackBoxFileInBase64.firstOrNull,
      'layoutPlantFile': layoutPlantFileInBase64.firstOrNull,
      'images': imagesInBase64,
      if (configFileWithExtension != null)
        'configFile': {configFileWithExtension: configFileInBase64.firstOrNull}
    };