-
Type:
Improvement
-
Resolution: Fixed
-
Priority:
Major - P3
-
None
-
Affects Version/s: None
-
Component/s: None
-
2 - S (<= 1 week)
-
4
-
1735
What happened?
Because MongoDB/Atlas Search does not transfer information about fields that have their default values (nullable). The fromEJSON throws InvalidEJson because the fields are not set with NULL.
Repro steps
Create a model with nullable fields like:
Unable to find source-code formatter for language: dart. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
class _AddressModel { late String? type; late String street; late String? suburb; late String city; late String? state; late String? postalCode; late String countryCode; late _LocationModel? location; }
Try to convert Map (JSON) to Object
Note: type, suburb, state and postalCode have their default value (null) so nothing is returned from Atlas Search
Unable to find source-code formatter for language: dart. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
AddressModel testWithCrash = AddressModel.fromEJson<AddressModel>(
{
countryCode: NLD,
street: Malieveld,
city: Den Haag,
location: {
coord: [{$numberDouble: 52.085413}, {$numberDouble: 4.317371}],
type: Point}
}
)
static AddressModel _fromEJson(EJsonValue ejson) {
return switch (ejson) {
{
'type': EJsonValue type, <--------- Throws because the json above does not contain that field.
'street': EJsonValue street,
'suburb': EJsonValue suburb,
'city': EJsonValue city,
'state': EJsonValue state,
'postalCode': EJsonValue postalCode,
'countryCode': EJsonValue countryCode,
'location': EJsonValue location,
} =>
AddressModel(
type: fromEJson(type),
street: fromEJson(street),
suburb: fromEJson(suburb),
city: fromEJson(city),
state: fromEJson(state),
postalCode: fromEJson(postalCode),
countryCode: fromEJson(countryCode),
location: fromEJson(location),
),
_ => raiseInvalidEJson(ejson),
};
}
Version
Flutter 3.19.3 • channel stable - Dart SDK version: 3.3.1 (stable)
What Atlas Services are you using?
Both Atlas Device Sync and Atlas App Services
What type of application is this?
Flutter Application
Client OS and version
realm: ^3.0.0
Code snippets
No response
Stacktrace of the exception/crash you're getting
Unable to find source-code formatter for language: shell. Available languages are: actionscript, ada, applescript, bash, c, c#, c++, cpp, css, erlang, go, groovy, haskell, html, java, javascript, js, json, lua, none, nyan, objc, perl, php, python, r, rainbow, ruby, scala, sh, sql, swift, visualbasic, xml, yaml
Exception has occurred.
InvalidEJson (Invalid EJson for AddressModel: {countryCode: NLD, street: Malieveld, city: Den Haag, location: {coord: [{$numberDouble: 52.085413}, {$numberDouble: 4.317371}], type: Point}})
Relevant log output
No response