ScanResult.fromJson constructor

ScanResult.fromJson(
  1. Map<String, dynamic> json
)

Deserializes a ScanResult from a JSON map.

Implementation

factory ScanResult.fromJson(Map<String, dynamic> json) {
  final modeStr = json['mode'] as String? ?? 'qr';
  final mode = ScanMode.values.firstWhere(
    (m) => m.name == modeStr,
    orElse: () => ScanMode.qr,
  );

  final fieldsRaw = json['fields'] as Map<String, dynamic>?;
  final fields = fieldsRaw?.map((k, v) => MapEntry(k, v.toString())) ??
      const <String, String>{};

  final metadataRaw = json['metadata'] as Map<String, dynamic>?;
  final metadata = metadataRaw ?? const <String, dynamic>{};

  final verificationsRaw = json['verifications'] as Map<String, dynamic>?;
  final verifications = verificationsRaw?.map((k, v) => MapEntry(k, v == true)) ??
      const <String, bool>{};

  final preprocessingRaw = json['preprocessingInfo'] as Map<String, dynamic>?;
  final preprocessingInfo = preprocessingRaw ?? const <String, dynamic>{};

  List<BarcodeResult>? barcodes;
  if (json['detectedBarcodes'] != null && json['detectedBarcodes'] is List) {
    barcodes = (json['detectedBarcodes'] as List)
        .map((b) => BarcodeResult.fromJson(b as Map<String, dynamic>))
        .toList();
  }

  DocumentQualityScore? quality;
  if (json['qualityScore'] != null && json['qualityScore'] is Map) {
    quality = DocumentQualityScore.fromJson(
        json['qualityScore'] as Map<String, dynamic>);
  }

  BankChequeInfo? cheque;
  if (json['bankChequeInfo'] != null && json['bankChequeInfo'] is Map) {
    cheque = BankChequeInfo.fromJson(
        json['bankChequeInfo'] as Map<String, dynamic>);
  }

  OcrTextResult? ocrResult;
  if (json['ocrTextResult'] != null && json['ocrTextResult'] is Map) {
    ocrResult = OcrTextResult.fromJson(
        json['ocrTextResult'] as Map<String, dynamic>);
  }

  // Deserialize roi rectangle
  Rect? roi;
  if (json['roi'] != null && json['roi'] is Map) {
    final r = json['roi'] as Map<String, dynamic>;
    roi = Rect.fromLTWH(
      (r['left'] as num).toDouble(),
      (r['top'] as num).toDouble(),
      (r['width'] as num).toDouble(),
      (r['height'] as num).toDouble(),
    );
  }

  // Deserialize corner points
  List<Offset>? corners;
  if (json['corners'] != null && json['corners'] is List) {
    corners = (json['corners'] as List)
        .map((c) {
          final m = c as Map<String, dynamic>;
          return Offset(
            (m['x'] as num).toDouble(),
            (m['y'] as num).toDouble(),
          );
        })
        .toList();
  }

  // Deserialize image size
  Size? imageSize;
  if (json['imageSize'] != null && json['imageSize'] is Map) {
    final s = json['imageSize'] as Map<String, dynamic>;
    imageSize = Size(
      (s['width'] as num).toDouble(),
      (s['height'] as num).toDouble(),
    );
  }

  return ScanResult(
    mode: mode,
    rawValue: json['rawValue'] as String? ?? '',
    fields: fields,
    isValid: json['isValid'] as bool? ?? true,
    confidence: (json['confidence'] as num?)?.toDouble() ?? 1.0,
    timestamp: json['timestamp'] != null
        ? DateTime.tryParse(json['timestamp'] as String) ?? DateTime.now()
        : DateTime.now(),
    imagePath: json['imagePath'] as String?,
    format: json['format'] as String?,
    documentCategory: json['documentCategory'] as String?,
    roi: roi,
    isDuplicate: json['isDuplicate'] as bool? ?? false,
    corners: corners,
    imageSize: imageSize,
    enhancementsApplied: (json['enhancementsApplied'] as List?)
        ?.map((e) => e.toString())
        .toList(),
    scanDuration: json['scanDurationMs'] != null
        ? Duration(milliseconds: json['scanDurationMs'] as int)
        : null,
    metadata: metadata,
    qualityScore: quality,
    consensusConfidence: (json['consensusConfidence'] as num?)?.toDouble(),
    verifications: verifications,
    preprocessingInfo: preprocessingInfo,
    bankChequeInfo: cheque,
    detectedBarcodes: barcodes,
    sessionId: json['sessionId'] as String?,
    exportFormat: json['exportFormat'] as String?,
    encryptionStatus: json['encryptionStatus'] as String?,
    watermarkApplied: json['watermarkApplied'] as bool? ?? false,
    ocrTextResult: ocrResult,
  );
}