ScanResult.fromJson constructor
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,
);
}