BuitlValue: Ignore cast error
1 min readNov 26, 2021
As we know, when the backend returns a mismatched type of JSON, it throws DeserializationError
as default.
For example:
abstract class User implements Built<User, UserBuilder> {
User._();
factory User([void Function(UserBuilder) updates]) = _$User;
bool? get activated; static Serializer<User> get serializer => _$userSerializer; static User? fromJson(String jsonString) {
return serializers.deserializeWith(
serializer, json.decode(jsonString));
}
}
When User.fromJson(jsonString)
with the following jsonString:
{
"activated": 0
}
it throws DeserializationError
:
Deserializing '0' to 'bool' failed due to: type 'int' is not a subtype of type 'bool' in type cast
Ideally, we want to make it null
if it’s nullable type as well instead of throwing a case exception.
Let modify the serializers.dart
:
extension SerializersBuilderX on SerializersBuilder {
void mergeEntireSerializers(Serializers serializers) {
addPlugins(serializers.serializerPlugins);
merge(serializers);
addBuilderFactories(serializers.builderFactories);
}
void addBuilderFactories(BuiltMap<FullType, Function> builderFactories) {
for (final entry in builderFactories.entries) {
addBuilderFactory(entry.key, entry.value);
}
}
void addPlugins(Iterable<SerializerPlugin> plugins) {
for (final plugin in plugins) {
addPlugin(plugin);
}
}
}/// - final Serializers serializers =
/// - (_$serializers.toBuilder()
/// - ..addPlugin(StandardJsonPlugin()))
/// - .build();
final Serializers serializers = (SimpleBuiltJsonSerializersBuilder()
..mergeEntireSerializers(_$serializers.toBuilder().build())
..addPlugin(StandardJsonPlugin())
).build();
And add simple_built_json_serializers.dart
That’s it, it will keep it null
instead of throwing a cast exception.