BuitlValue: Ignore cast error

Andrew Chen
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.

--

--

No responses yet