deserialize method
Object?
deserialize(
- DartType targetType,
- String expression,
- TypeHelperContextWithConfig 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
Object? deserialize(
DartType targetType,
String expression,
TypeHelperContextWithConfig context,
bool defaultProvided,
) {
final converter = _typeConverter(targetType, context);
if (converter == null) {
return null;
}
if (!converter.jsonType.isNullableType && targetType.isNullableType) {
const converterFromJsonName = r'_$JsonConverterFromJson';
context.addMember('''
Value? $converterFromJsonName<Json, Value>(
Object? json,
Value? Function(Json json) fromJson,
) => ${ifNullOrElse('json', 'null', 'fromJson(json as Json)')};
''');
return _nullableJsonConverterLambdaResult(
converter,
name: converterFromJsonName,
targetType: targetType,
expression: expression,
callback: '${converter.accessString}.fromJson',
);
}
return LambdaResult(
expression,
'${converter.accessString}.fromJson',
asContent: converter.jsonType,
);
}