deserialize method
String?
deserialize(
- DartType targetType,
- String expression,
- TypeHelperContext context,
- bool defaultProvided,
override
Returns Dart code that deserializes an expression
representing a JSON
literal to into targetType
.
If targetType
is not supported, returns null
.
Let's say you want to deserialize a class Foo
by taking an int
stored
in a JSON literal and calling the Foo.fromInt
constructor.
Treating expression
as a opaque Dart expression representing a JSON
literal, the deserialize implementation could be a simple as:
String deserialize(DartType targetType, String expression) =>
"new Foo.fromInt($expression)";
```.
Note that [targetType] is not used here. If you wanted to support many
types of [targetType] you could write:
```dart
String deserialize(DartType targetType, String expression) =>
"new ${targetType.name}.fromInt($expression)";
```.
Implementation
@override
String? deserialize(
DartType targetType,
String expression,
TypeHelperContext context,
bool defaultProvided,
) {
if (targetType.isDartCoreObject && !targetType.isNullableType) {
final question = defaultProvided ? '?' : '';
return '$expression as Object$question';
} else if (targetType.isDartCoreObject || targetType is DynamicType) {
// just return it as-is. We'll hope it's safe.
return expression;
} else if (targetType.isDartCoreDouble) {
final targetTypeNullable = defaultProvided || targetType.isNullableType;
final question = targetTypeNullable ? '?' : '';
return '($expression as num$question)$question.toDouble()';
} else if (simpleJsonTypeChecker.isAssignableFromType(targetType)) {
final typeCode = typeToCode(targetType, forceNullable: defaultProvided);
return '$expression as $typeCode';
}
return null;
}