diff --git a/_test_yaml/test/src/build_config.g.dart b/_test_yaml/test/src/build_config.g.dart index 61e578ec4..e4d832e78 100644 --- a/_test_yaml/test/src/build_config.g.dart +++ b/_test_yaml/test/src/build_config.g.dart @@ -103,28 +103,23 @@ Builder _$BuilderFromJson(Map json) => $checkedCreate( }, ); -Map _$BuilderToJson(Builder instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('target', instance.target); - writeNotNull('import', instance.import); - writeNotNull('is_optional', instance.isOptional); - writeNotNull('configLocation', instance.configLocation?.toString()); - writeNotNull('auto_apply', _$AutoApplyEnumMap[instance.autoApply]); - writeNotNull('build_to', _$BuildToEnumMap[instance.buildTo]); - writeNotNull('defaultEnumTest', _$AutoApplyEnumMap[instance.defaultEnumTest]); - val['builder_factories'] = instance.builderFactories; - writeNotNull('applies_builders', instance.appliesBuilders); - writeNotNull('required_inputs', instance.requiredInputs); - writeNotNull('build_extensions', instance.buildExtensions); - return val; -} +Map _$BuilderToJson(Builder instance) => { + if (instance.target case final value?) 'target': value, + if (instance.import case final value?) 'import': value, + if (instance.isOptional case final value?) 'is_optional': value, + if (instance.configLocation?.toString() case final value?) + 'configLocation': value, + if (_$AutoApplyEnumMap[instance.autoApply] case final value?) + 'auto_apply': value, + if (_$BuildToEnumMap[instance.buildTo] case final value?) + 'build_to': value, + if (_$AutoApplyEnumMap[instance.defaultEnumTest] case final value?) + 'defaultEnumTest': value, + 'builder_factories': instance.builderFactories, + if (instance.appliesBuilders case final value?) 'applies_builders': value, + if (instance.requiredInputs case final value?) 'required_inputs': value, + if (instance.buildExtensions case final value?) 'build_extensions': value, + }; const _$BuildToEnumMap = { BuildTo.cache: 'cache', diff --git a/example/lib/example.g.dart b/example/lib/example.g.dart index b4cf7de11..f497bc0e7 100644 --- a/example/lib/example.g.dart +++ b/example/lib/example.g.dart @@ -19,24 +19,14 @@ Person _$PersonFromJson(Map json) => Person( .toList(), ); -Map _$PersonToJson(Person instance) { - final val = { - 'firstName': instance.firstName, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('middleName', instance.middleName); - val['lastName'] = instance.lastName; - val['date-of-birth'] = instance.dateOfBirth.toIso8601String(); - val['last-order'] = instance.lastOrder?.toIso8601String(); - val['orders'] = instance.orders; - return val; -} +Map _$PersonToJson(Person instance) => { + 'firstName': instance.firstName, + if (instance.middleName case final value?) 'middleName': value, + 'lastName': instance.lastName, + 'date-of-birth': instance.dateOfBirth.toIso8601String(), + 'last-order': instance.lastOrder?.toIso8601String(), + 'orders': instance.orders, + }; Order _$OrderFromJson(Map json) => Order( Order._dateTimeFromEpochUs((json['date'] as num).toInt()), @@ -50,23 +40,16 @@ Order _$OrderFromJson(Map json) => Order( ..prepTime = Order._durationFromMilliseconds((json['prep-time'] as num?)?.toInt()); -Map _$OrderToJson(Order instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('count', instance.count); - writeNotNull('itemNumber', instance.itemNumber); - writeNotNull('isRushed', instance.isRushed); - writeNotNull('item', instance.item); - writeNotNull('prep-time', Order._durationToMilliseconds(instance.prepTime)); - writeNotNull('date', Order._dateTimeToEpochUs(instance.date)); - return val; -} +Map _$OrderToJson(Order instance) => { + if (instance.count case final value?) 'count': value, + if (instance.itemNumber case final value?) 'itemNumber': value, + if (instance.isRushed case final value?) 'isRushed': value, + if (instance.item case final value?) 'item': value, + if (Order._durationToMilliseconds(instance.prepTime) case final value?) + 'prep-time': value, + if (Order._dateTimeToEpochUs(instance.date) case final value?) + 'date': value, + }; Item _$ItemFromJson(Map json) => Item() ..count = (json['count'] as num?)?.toInt() diff --git a/example/test/example_test.dart b/example/test/example_test.dart index e2abf3424..99dc2ed53 100644 --- a/example/test/example_test.dart +++ b/example/test/example_test.dart @@ -10,8 +10,12 @@ import 'package:test/test.dart'; void main() { test('JsonSerializable', () { - final person = Person('Inigo', 'Montoya', DateTime(1560, 5, 5)) - ..orders = [Order(DateTime.now())..item = (Item()..count = 42)]; + final person = Person( + 'Inigo', + 'Montoya', + DateTime(1560, 5, 5), + middleName: 'Bob', + )..orders = [Order(DateTime.now())..item = (Item()..count = 42)]; final personJson = loudEncode(person); diff --git a/json_serializable/CHANGELOG.md b/json_serializable/CHANGELOG.md index 222e369d9..7c14862e2 100644 --- a/json_serializable/CHANGELOG.md +++ b/json_serializable/CHANGELOG.md @@ -1,5 +1,6 @@ -## 6.8.1-wip +## 6.9.0-wip +- Use conditional map syntax to clean up `null` handling in `toJson` functions. - Require Dart 3.5 ## 6.8.0 diff --git a/json_serializable/lib/src/constants.dart b/json_serializable/lib/src/constants.dart index 9949b77cc..a151ff034 100644 --- a/json_serializable/lib/src/constants.dart +++ b/json_serializable/lib/src/constants.dart @@ -5,8 +5,7 @@ /// Name used for closure argument when generating calls to `map`. const closureArg = 'e'; -const generatedLocalVarName = 'val'; -const toJsonMapHelperName = 'writeNotNull'; +const generatedLocalVarName = 'value'; const converterOrKeyInstructions = r''' * Use `JsonConverter` diff --git a/json_serializable/lib/src/encoder_helper.dart b/json_serializable/lib/src/encoder_helper.dart index 05d4c714d..4e876b757 100644 --- a/json_serializable/lib/src/encoder_helper.dart +++ b/json_serializable/lib/src/encoder_helper.dart @@ -97,18 +97,22 @@ mixin EncodeHelper implements HelperCore { if (config.genericArgumentFactories) _writeGenericArgumentFactories(buffer); - buffer.write(') '); + buffer + ..write(') ') + ..writeln('=> {') + ..writeAll(accessibleFields.map((field) { + final access = _fieldAccess(field); - final canWriteAllJsonValuesWithoutNullCheck = - accessibleFields.every(_canWriteJsonWithoutNullCheck); + final keyExpression = safeNameAccess(field); + final valueExpression = _serializeField(field, access); - if (canWriteAllJsonValuesWithoutNullCheck) { - // write simple `toJson` method that includes all keys... - _writeToJsonSimple(buffer, accessibleFields); - } else { - // At least one field should be excluded if null - _writeToJsonWithNullChecks(buffer, accessibleFields); - } + final keyValuePair = _canWriteJsonWithoutNullCheck(field) + ? '$keyExpression: $valueExpression' + : 'if ($valueExpression case final $generatedLocalVarName?) ' + '$keyExpression: $generatedLocalVarName'; + return ' $keyValuePair,\n'; + })) + ..writeln('};'); yield buffer.toString(); } @@ -125,81 +129,8 @@ mixin EncodeHelper implements HelperCore { } } - void _writeToJsonSimple(StringBuffer buffer, Iterable fields) { - buffer - ..writeln('=> {') - ..writeAll(fields.map((field) { - final access = _fieldAccess(field); - final value = - '${safeNameAccess(field)}: ${_serializeField(field, access)}'; - return ' $value,\n'; - })) - ..writeln('};'); - } - static const _toJsonParamName = 'instance'; - void _writeToJsonWithNullChecks( - StringBuffer buffer, - Iterable fields, - ) { - buffer - ..writeln('{') - ..writeln(' final $generatedLocalVarName = {'); - - // Note that the map literal is left open above. As long as target fields - // don't need to be intercepted by the `only if null` logic, write them - // to the map literal directly. In theory, should allow more efficient - // serialization. - var directWrite = true; - - for (final field in fields) { - var safeFieldAccess = _fieldAccess(field); - final safeJsonKeyString = safeNameAccess(field); - - // If `fieldName` collides with one of the local helpers, prefix - // access with `this.`. - if (safeFieldAccess == generatedLocalVarName || - safeFieldAccess == toJsonMapHelperName) { - safeFieldAccess = 'this.$safeFieldAccess'; - } - - final expression = _serializeField(field, safeFieldAccess); - if (_canWriteJsonWithoutNullCheck(field)) { - if (directWrite) { - buffer.writeln(' $safeJsonKeyString: $expression,'); - } else { - buffer.writeln( - ' $generatedLocalVarName[$safeJsonKeyString] = $expression;'); - } - } else { - if (directWrite) { - // close the still-open map literal - buffer - ..writeln(' };') - ..writeln() - - // write the helper to be used by all following null-excluding - // fields - ..writeln(''' - void $toJsonMapHelperName(String key, dynamic value) { - if (value != null) { - $generatedLocalVarName[key] = value; - } - } -'''); - directWrite = false; - } - buffer.writeln( - ' $toJsonMapHelperName($safeJsonKeyString, $expression);'); - } - } - - buffer - ..writeln(' return $generatedLocalVarName;') - ..writeln(' }'); - } - String _serializeField(FieldElement field, String accessExpression) { try { return getHelperContext(field) diff --git a/json_serializable/pubspec.yaml b/json_serializable/pubspec.yaml index 1adf0afb2..854f2c7fd 100644 --- a/json_serializable/pubspec.yaml +++ b/json_serializable/pubspec.yaml @@ -1,5 +1,5 @@ name: json_serializable -version: 6.8.1-wip +version: 6.9.0-wip description: >- Automatically generate code for converting to and from JSON by annotating Dart classes. diff --git a/json_serializable/test/custom_configuration_test.dart b/json_serializable/test/custom_configuration_test.dart index a717b7bb8..4ac5d02ca 100644 --- a/json_serializable/test/custom_configuration_test.dart +++ b/json_serializable/test/custom_configuration_test.dart @@ -214,7 +214,6 @@ Map _$TrivialNestedNonNullableToJson( test('some', () async { final output = await runForElementNamed('IncludeIfNullAll'); expect(output, isNot(contains(generatedLocalVarName))); - expect(output, isNot(contains(toJsonMapHelperName))); }); }); } diff --git a/json_serializable/test/integration/converter_examples.g.dart b/json_serializable/test/integration/converter_examples.g.dart index 2829672a9..f19c8fc2e 100644 --- a/json_serializable/test/integration/converter_examples.g.dart +++ b/json_serializable/test/integration/converter_examples.g.dart @@ -26,33 +26,26 @@ Issue1202RegressionClass _$Issue1202RegressionClassFromJson( ); Map _$Issue1202RegressionClassToJson( - Issue1202RegressionClass instance) { - final val = { - 'valueWithFunctions': - Issue1202RegressionClass._toJson(instance.valueWithFunctions), - 'notNullableValueWithConverter': - const _Issue1202RegressionNotNullConverter() - .toJson(instance.notNullableValueWithConverter), - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('value', _$Issue1202RegressionEnumEnumMap[instance.value]); - writeNotNull('normalNullableValue', instance.normalNullableValue); - writeNotNull( - 'notNullableValueWithNullableConverter', - const _Issue1202RegressionConverter() - .toJson(instance.notNullableValueWithNullableConverter)); - writeNotNull( - 'valueWithNullableFunctions', - Issue1202RegressionClass._toJsonNullable( - instance.valueWithNullableFunctions)); - return val; -} + Issue1202RegressionClass instance) => + { + 'valueWithFunctions': + Issue1202RegressionClass._toJson(instance.valueWithFunctions), + 'notNullableValueWithConverter': + const _Issue1202RegressionNotNullConverter() + .toJson(instance.notNullableValueWithConverter), + if (_$Issue1202RegressionEnumEnumMap[instance.value] case final value?) + 'value': value, + if (instance.normalNullableValue case final value?) + 'normalNullableValue': value, + if (const _Issue1202RegressionConverter() + .toJson(instance.notNullableValueWithNullableConverter) + case final value?) + 'notNullableValueWithNullableConverter': value, + if (Issue1202RegressionClass._toJsonNullable( + instance.valueWithNullableFunctions) + case final value?) + 'valueWithNullableFunctions': value, + }; const _$Issue1202RegressionEnumEnumMap = { Issue1202RegressionEnum.normalValue: 42, @@ -65,21 +58,13 @@ Regression1229 _$Regression1229FromJson(Map json) => json['date'], const DateTimeConverter().fromJson), ); -Map _$Regression1229ToJson(Regression1229 instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull( - 'date', - _$JsonConverterToJson( - instance.date, const DateTimeConverter().toJson)); - return val; -} +Map _$Regression1229ToJson(Regression1229 instance) => + { + if (_$JsonConverterToJson( + instance.date, const DateTimeConverter().toJson) + case final value?) + 'date': value, + }; Value? _$JsonConverterFromJson( Object? json, diff --git a/json_serializable/test/integration/create_per_field_to_json_example.g.dart b/json_serializable/test/integration/create_per_field_to_json_example.g.dart index 1c4b0fe88..28f3443a5 100644 --- a/json_serializable/test/integration/create_per_field_to_json_example.g.dart +++ b/json_serializable/test/integration/create_per_field_to_json_example.g.dart @@ -45,26 +45,17 @@ abstract class _$ModelPerFieldToJson { static Object? nestedExcludeIfNull(Nested? instance) => instance?.toJson(); } -Map _$ModelToJson(Model instance) { - final val = { - 'firstName': instance.firstName, - 'lastName': instance.lastName, - 'enumValue': _$EnumValueEnumMap[instance.enumValue], - 'nested': instance.nested?.toJson(), - 'nestedGeneric': instance.nestedGeneric?.toJson( - (value) => value, - ), - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('nestedExcludeIfNull', instance.nestedExcludeIfNull?.toJson()); - return val; -} +Map _$ModelToJson(Model instance) => { + 'firstName': instance.firstName, + 'lastName': instance.lastName, + 'enumValue': _$EnumValueEnumMap[instance.enumValue], + 'nested': instance.nested?.toJson(), + 'nestedGeneric': instance.nestedGeneric?.toJson( + (value) => value, + ), + if (instance.nestedExcludeIfNull?.toJson() case final value?) + 'nestedExcludeIfNull': value, + }; const _$EnumValueEnumMap = { EnumValue.first: '1', diff --git a/json_serializable/test/integration/json_enum_example.g.dart b/json_serializable/test/integration/json_enum_example.g.dart index 6408e9e1d..95ae41b17 100644 --- a/json_serializable/test/integration/json_enum_example.g.dart +++ b/json_serializable/test/integration/json_enum_example.g.dart @@ -53,19 +53,13 @@ Issue1226Regression _$Issue1226RegressionFromJson(Map json) => _$Issue1145RegressionEnumEnumMap, json['durationType']), ); -Map _$Issue1226RegressionToJson(Issue1226Regression instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull( - 'durationType', _$Issue1145RegressionEnumEnumMap[instance.durationType]); - return val; -} +Map _$Issue1226RegressionToJson( + Issue1226Regression instance) => + { + if (_$Issue1145RegressionEnumEnumMap[instance.durationType] + case final value?) + 'durationType': value, + }; const _$StandAloneEnumEnumMap = { StandAloneEnum.alpha: 'a', diff --git a/json_serializable/test/integration/json_test_example.g.dart b/json_serializable/test/integration/json_test_example.g.dart index ec12eb554..bf56859ed 100644 --- a/json_serializable/test/integration/json_test_example.g.dart +++ b/json_serializable/test/integration/json_test_example.g.dart @@ -85,26 +85,17 @@ Order _$OrderFromJson(Map json) { StatusCode.success; } -Map _$OrderToJson(Order instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('count', instance.count); - val['isRushed'] = instance.isRushed; - val['duration'] = instance.duration?.inMicroseconds; - val['category'] = _$CategoryEnumMap[instance.category]; - val['items'] = instance.items; - val['platform'] = instance.platform; - val['altPlatforms'] = instance.altPlatforms; - val['homepage'] = instance.homepage?.toString(); - val['status_code'] = _$StatusCodeEnumMap[instance.statusCode]; - return val; -} +Map _$OrderToJson(Order instance) => { + if (instance.count case final value?) 'count': value, + 'isRushed': instance.isRushed, + 'duration': instance.duration?.inMicroseconds, + 'category': _$CategoryEnumMap[instance.category], + 'items': instance.items, + 'platform': instance.platform, + 'altPlatforms': instance.altPlatforms, + 'homepage': instance.homepage?.toString(), + 'status_code': _$StatusCodeEnumMap[instance.statusCode], + }; const _$StatusCodeEnumMap = { StatusCode.success: 200, @@ -125,24 +116,13 @@ Item _$ItemFromJson(Map json) => Item( .toList() ..geoPoint = _fromJsonGeoPoint(json['geoPoint'] as Map?); -Map _$ItemToJson(Item instance) { - final val = { - 'price': instance.price, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('item-number', instance.itemNumber); - val['saleDates'] = - instance.saleDates?.map((e) => e.toIso8601String()).toList(); - val['rates'] = instance.rates; - val['geoPoint'] = _toJsonGeoPoint(instance.geoPoint); - return val; -} +Map _$ItemToJson(Item instance) => { + 'price': instance.price, + if (instance.itemNumber case final value?) 'item-number': value, + 'saleDates': instance.saleDates?.map((e) => e.toIso8601String()).toList(), + 'rates': instance.rates, + 'geoPoint': _toJsonGeoPoint(instance.geoPoint), + }; Numbers _$NumbersFromJson(Map json) => Numbers() ..ints = diff --git a/json_serializable/test/integration/json_test_example.g_any_map.g.dart b/json_serializable/test/integration/json_test_example.g_any_map.g.dart index 5fe79152e..ef2ad4f95 100644 --- a/json_serializable/test/integration/json_test_example.g_any_map.g.dart +++ b/json_serializable/test/integration/json_test_example.g_any_map.g.dart @@ -85,26 +85,17 @@ Order _$OrderFromJson(Map json) { StatusCode.success; } -Map _$OrderToJson(Order instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('count', instance.count); - val['isRushed'] = instance.isRushed; - val['duration'] = instance.duration?.inMicroseconds; - val['category'] = _$CategoryEnumMap[instance.category]; - val['items'] = instance.items; - val['platform'] = instance.platform; - val['altPlatforms'] = instance.altPlatforms; - val['homepage'] = instance.homepage?.toString(); - val['status_code'] = _$StatusCodeEnumMap[instance.statusCode]; - return val; -} +Map _$OrderToJson(Order instance) => { + if (instance.count case final value?) 'count': value, + 'isRushed': instance.isRushed, + 'duration': instance.duration?.inMicroseconds, + 'category': _$CategoryEnumMap[instance.category], + 'items': instance.items, + 'platform': instance.platform, + 'altPlatforms': instance.altPlatforms, + 'homepage': instance.homepage?.toString(), + 'status_code': _$StatusCodeEnumMap[instance.statusCode], + }; const _$StatusCodeEnumMap = { StatusCode.success: 200, @@ -125,24 +116,13 @@ Item _$ItemFromJson(Map json) => Item( .toList() ..geoPoint = _fromJsonGeoPoint(json['geoPoint'] as Map?); -Map _$ItemToJson(Item instance) { - final val = { - 'price': instance.price, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('item-number', instance.itemNumber); - val['saleDates'] = - instance.saleDates?.map((e) => e.toIso8601String()).toList(); - val['rates'] = instance.rates; - val['geoPoint'] = _toJsonGeoPoint(instance.geoPoint); - return val; -} +Map _$ItemToJson(Item instance) => { + 'price': instance.price, + if (instance.itemNumber case final value?) 'item-number': value, + 'saleDates': instance.saleDates?.map((e) => e.toIso8601String()).toList(), + 'rates': instance.rates, + 'geoPoint': _toJsonGeoPoint(instance.geoPoint), + }; Numbers _$NumbersFromJson(Map json) => Numbers() ..ints = diff --git a/json_serializable/test/kitchen_sink/kitchen_sink.g_exclude_null.g.dart b/json_serializable/test/kitchen_sink/kitchen_sink.g_exclude_null.g.dart index a3a8f8550..39b0eb184 100644 --- a/json_serializable/test/kitchen_sink/kitchen_sink.g_exclude_null.g.dart +++ b/json_serializable/test/kitchen_sink/kitchen_sink.g_exclude_null.g.dart @@ -98,69 +98,63 @@ KitchenSink _$KitchenSinkFromJson(Map json) => KitchenSink( ), ); -Map _$KitchenSinkToJson(KitchenSink instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('no-42', instance.ctorValidatedNo42); - writeNotNull('dateTime', instance.dateTime?.toIso8601String()); - writeNotNull('bigInt', instance.bigInt?.toString()); - writeNotNull('iterable', instance.iterable?.toList()); - val['dynamicIterable'] = instance.dynamicIterable.toList(); - val['objectIterable'] = instance.objectIterable.toList(); - val['intIterable'] = instance.intIterable.toList(); - val['set'] = instance.set.toList(); - val['dynamicSet'] = instance.dynamicSet.toList(); - val['objectSet'] = instance.objectSet.toList(); - val['intSet'] = instance.intSet.toList(); - val['dateTimeSet'] = - instance.dateTimeSet.map((e) => e.toIso8601String()).toList(); - val['datetime-iterable'] = - instance.dateTimeIterable.map((e) => e.toIso8601String()).toList(); - val['list'] = instance.list; - val['dynamicList'] = instance.dynamicList; - val['objectList'] = instance.objectList; - val['intList'] = instance.intList; - val['dateTimeList'] = - instance.dateTimeList.map((e) => e.toIso8601String()).toList(); - val['nullableSimpleObjectList'] = instance.nullableSimpleObjectList; - val['map'] = instance.map; - val['stringStringMap'] = instance.stringStringMap; - val['dynamicIntMap'] = instance.dynamicIntMap; - val['objectDateTimeMap'] = instance.objectDateTimeMap - .map((k, e) => MapEntry(k, e.toIso8601String())); - val['nullableSimpleObjectMap'] = instance.nullableSimpleObjectMap; - val['crazyComplex'] = instance.crazyComplex - .map((e) => e?.map((k, e) => MapEntry( - k, - e?.map((k, e) => MapEntry( +Map _$KitchenSinkToJson(KitchenSink instance) => + { + if (instance.ctorValidatedNo42 case final value?) 'no-42': value, + if (instance.dateTime?.toIso8601String() case final value?) + 'dateTime': value, + if (instance.bigInt?.toString() case final value?) 'bigInt': value, + if (instance.iterable?.toList() case final value?) 'iterable': value, + 'dynamicIterable': instance.dynamicIterable.toList(), + 'objectIterable': instance.objectIterable.toList(), + 'intIterable': instance.intIterable.toList(), + 'set': instance.set.toList(), + 'dynamicSet': instance.dynamicSet.toList(), + 'objectSet': instance.objectSet.toList(), + 'intSet': instance.intSet.toList(), + 'dateTimeSet': + instance.dateTimeSet.map((e) => e.toIso8601String()).toList(), + 'datetime-iterable': + instance.dateTimeIterable.map((e) => e.toIso8601String()).toList(), + 'list': instance.list, + 'dynamicList': instance.dynamicList, + 'objectList': instance.objectList, + 'intList': instance.intList, + 'dateTimeList': + instance.dateTimeList.map((e) => e.toIso8601String()).toList(), + 'nullableSimpleObjectList': instance.nullableSimpleObjectList, + 'map': instance.map, + 'stringStringMap': instance.stringStringMap, + 'dynamicIntMap': instance.dynamicIntMap, + 'objectDateTimeMap': instance.objectDateTimeMap + .map((k, e) => MapEntry(k, e.toIso8601String())), + 'nullableSimpleObjectMap': instance.nullableSimpleObjectMap, + 'crazyComplex': instance.crazyComplex + .map((e) => e?.map((k, e) => MapEntry( k, - e - ?.map((e) => e?.map((e) => e.toIso8601String()).toList()) - .toList()))))) - .toList(); - val['val'] = instance.val; - writeNotNull('writeNotNull', instance.writeNotNull); - writeNotNull(r'$string', instance.string); - val['simpleObject'] = instance.simpleObject; - val['strictKeysObject'] = instance.strictKeysObject; - writeNotNull('validatedPropertyNo42', instance.validatedPropertyNo42); - writeNotNull( - 'recordField', - instance.recordField == null - ? null - : { - r'$1': instance.recordField!.$1, - r'$2': instance.recordField!.$2, - 'truth': instance.recordField!.truth, - }); - return val; -} + e?.map((k, e) => MapEntry( + k, + e + ?.map((e) => e?.map((e) => e.toIso8601String()).toList()) + .toList()))))) + .toList(), + 'val': instance.val, + if (instance.writeNotNull case final value?) 'writeNotNull': value, + if (instance.string case final value?) r'$string': value, + 'simpleObject': instance.simpleObject, + 'strictKeysObject': instance.strictKeysObject, + if (instance.validatedPropertyNo42 case final value?) + 'validatedPropertyNo42': value, + if (instance.recordField == null + ? null + : { + r'$1': instance.recordField!.$1, + r'$2': instance.recordField!.$2, + 'truth': instance.recordField!.truth, + } + case final value?) + 'recordField': value, + }; $Rec? _$recordConvertNullable<$Rec>( Object? value, @@ -208,50 +202,47 @@ JsonConverterTestClass _$JsonConverterTestClassFromJson( ); Map _$JsonConverterTestClassToJson( - JsonConverterTestClass instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('duration', - const DurationMillisecondConverter().toJson(instance.duration)); - val['durationList'] = instance.durationList - .map(const DurationMillisecondConverter().toJson) - .toList(); - val['bigInt'] = const BigIntStringConverter().toJson(instance.bigInt); - val['bigIntMap'] = instance.bigIntMap - .map((k, e) => MapEntry(k, const BigIntStringConverter().toJson(e))); - writeNotNull( - 'nullableBigInt', - _$JsonConverterToJson( - instance.nullableBigInt, const BigIntStringConverter().toJson)); - val['nullableBigIntMap'] = instance.nullableBigIntMap.map((k, e) => MapEntry( - k, - _$JsonConverterToJson( - e, const BigIntStringConverter().toJson))); - writeNotNull('numberSilly', - TrivialNumberConverter.instance.toJson(instance.numberSilly)); - val['numberSillySet'] = instance.numberSillySet - .map(TrivialNumberConverter.instance.toJson) - .toList(); - writeNotNull( - 'dateTime', const EpochDateTimeConverter().toJson(instance.dateTime)); - writeNotNull( - 'trivialString', trivialStringConverter.toJson(instance.trivialString)); - writeNotNull( - 'nullableNumberSilly', - _$JsonConverterToJson(instance.nullableNumberSilly, - TrivialNumberConverter.instance.toJson)); - val['nullableNumberSillySet'] = instance.nullableNumberSillySet - .map((e) => _$JsonConverterToJson( - e, TrivialNumberConverter.instance.toJson)) - .toList(); - return val; -} + JsonConverterTestClass instance) => + { + if (const DurationMillisecondConverter().toJson(instance.duration) + case final value?) + 'duration': value, + 'durationList': instance.durationList + .map(const DurationMillisecondConverter().toJson) + .toList(), + 'bigInt': const BigIntStringConverter().toJson(instance.bigInt), + 'bigIntMap': instance.bigIntMap + .map((k, e) => MapEntry(k, const BigIntStringConverter().toJson(e))), + if (_$JsonConverterToJson( + instance.nullableBigInt, const BigIntStringConverter().toJson) + case final value?) + 'nullableBigInt': value, + 'nullableBigIntMap': instance.nullableBigIntMap.map((k, e) => MapEntry( + k, + _$JsonConverterToJson( + e, const BigIntStringConverter().toJson))), + if (TrivialNumberConverter.instance.toJson(instance.numberSilly) + case final value?) + 'numberSilly': value, + 'numberSillySet': instance.numberSillySet + .map(TrivialNumberConverter.instance.toJson) + .toList(), + if (const EpochDateTimeConverter().toJson(instance.dateTime) + case final value?) + 'dateTime': value, + if (trivialStringConverter.toJson(instance.trivialString) + case final value?) + 'trivialString': value, + if (_$JsonConverterToJson( + instance.nullableNumberSilly, + TrivialNumberConverter.instance.toJson) + case final value?) + 'nullableNumberSilly': value, + 'nullableNumberSillySet': instance.nullableNumberSillySet + .map((e) => _$JsonConverterToJson( + e, TrivialNumberConverter.instance.toJson)) + .toList(), + }; Value? _$JsonConverterFromJson( Object? json, diff --git a/json_serializable/test/src/_json_serializable_test_input.dart b/json_serializable/test/src/_json_serializable_test_input.dart index 1458630ff..f8537f346 100644 --- a/json_serializable/test/src/_json_serializable_test_input.dart +++ b/json_serializable/test/src/_json_serializable_test_input.dart @@ -215,20 +215,11 @@ class NoDeserializeBadKey { @ShouldGenerate( r''' Map _$IncludeIfNullOverrideToJson( - IncludeIfNullOverride instance) { - final val = { - 'number': instance.number, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('str', instance.str); - return val; -} + IncludeIfNullOverride instance) => + { + 'number': instance.number, + if (instance.str case final value?) 'str': value, + }; ''', ) @JsonSerializable(createFactory: false, includeIfNull: false) diff --git a/json_serializable/test/src/inheritance_test_input.dart b/json_serializable/test/src/inheritance_test_input.dart index 875743fc7..921e442e3 100644 --- a/json_serializable/test/src/inheritance_test_input.dart +++ b/json_serializable/test/src/inheritance_test_input.dart @@ -8,22 +8,13 @@ SubType _$SubTypeFromJson(Map json) => SubType( ..superReadWriteField = (json['superReadWriteField'] as num?)?.toInt() ..subTypeReadWrite = (json['subTypeReadWrite'] as num).toInt(); -Map _$SubTypeToJson(SubType instance) { - final val = { - 'super-final-field': instance.superFinalField, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('superReadWriteField', instance.superReadWriteField); - val['subTypeViaCtor'] = instance.subTypeViaCtor; - val['subTypeReadWrite'] = instance.subTypeReadWrite; - return val; -} +Map _$SubTypeToJson(SubType instance) => { + 'super-final-field': instance.superFinalField, + if (instance.superReadWriteField case final value?) + 'superReadWriteField': value, + 'subTypeViaCtor': instance.subTypeViaCtor, + 'subTypeReadWrite': instance.subTypeReadWrite, + }; ''') @JsonSerializable() class SubType extends SuperType { @@ -54,21 +45,13 @@ class SuperType { @ShouldGenerate(r''' Map _$SubTypeWithAnnotatedFieldOverrideExtendsToJson( - SubTypeWithAnnotatedFieldOverrideExtends instance) { - final val = { - 'super-final-field': instance.superFinalField, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('superReadWriteField', instance.superReadWriteField); - val['priceHalf'] = instance.priceHalf; - return val; -} + SubTypeWithAnnotatedFieldOverrideExtends instance) => + { + 'super-final-field': instance.superFinalField, + if (instance.superReadWriteField case final value?) + 'superReadWriteField': value, + 'priceHalf': instance.priceHalf, + }; ''') @JsonSerializable(createFactory: false) class SubTypeWithAnnotatedFieldOverrideExtends extends SuperType { diff --git a/json_serializable/test/src/to_from_json_test_input.dart b/json_serializable/test/src/to_from_json_test_input.dart index 7e5f57965..abeb24be2 100644 --- a/json_serializable/test/src/to_from_json_test_input.dart +++ b/json_serializable/test/src/to_from_json_test_input.dart @@ -175,18 +175,11 @@ String? _toStringNullOnEmpty(String input) => input.isEmpty ? null : input; @ShouldGenerate( r''' Map _$ToJsonNullableFalseIncludeIfNullFalseToJson( - ToJsonNullableFalseIncludeIfNullFalse instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('field', _toStringNullOnEmpty(instance.field)); - return val; -} + ToJsonNullableFalseIncludeIfNullFalse instance) => + { + if (_toStringNullOnEmpty(instance.field) case final value?) + 'field': value, + }; ''', ) @JsonSerializable(createFactory: false)