diff --git a/packages/dynamite/lib/src/openapi_builder.dart b/packages/dynamite/lib/src/openapi_builder.dart index 34cda798..bc06808a 100644 --- a/packages/dynamite/lib/src/openapi_builder.dart +++ b/packages/dynamite/lib/src/openapi_builder.dart @@ -1171,21 +1171,71 @@ TypeResult resolveObject( '/// ${propertySchema.description!}', ], ]); - if (_toDartName(propertyName) != propertyName || - propertySchema.isJsonString || - extraJsonKeyValues != null) { + final hasDifferentName = _toDartName(propertyName) != propertyName; + final isJsonString = propertySchema.isJsonString; + final isJsonStringArray = result is TypeResultList && (propertySchema.items?.isJsonString ?? false); + final hasExtraJsonKeyValues = + extraJsonKeyValues != null && extraJsonKeyValues.containsKey(propertyName); + if (hasDifferentName || isJsonString || isJsonStringArray || hasExtraJsonKeyValues) { + var fromJson = '${result.name}.fromJsonString'; + var toJson = '${result.name}.toJsonString'; + if (isJsonStringArray) { + fromJson = '_${_toDartName('${identifier}FromJsonString')}'; + if (!state.resolvedTypes.contains(fromJson)) { + state.resolvedTypes.add(fromJson); + state.output.add( + Method( + (final b) => b + ..name = fromJson + ..returns = refer(result.name) + ..lambda = true + ..requiredParameters.addAll([ + Parameter( + (final b) => b + ..name = 'data' + ..type = refer('String'), + ), + ]) + ..body = Code('${result.deserialize(result.decode('data'))};'), + ), + ); + } + toJson = '_${_toDartName('${identifier}ToJsonString')}'; + if (!state.resolvedTypes.contains(toJson)) { + state.resolvedTypes.add(toJson); + state.output.add( + Method( + (final b) => b + ..name = toJson + ..returns = refer('List?') + ..lambda = true + ..requiredParameters.addAll([ + Parameter( + (final b) => b + ..name = 'data' + ..type = refer(_makeNullable(result.name, true)), + ), + ]) + ..body = Code( + 'data == null ? null : ${result.encode(result.serialize('data'), mimeType: 'application/json', onlyChildren: true)};', + ), + ), + ); + } + } + b.annotations.add( refer('JsonKey').call( [], { - if (_toDartName(propertyName) != propertyName) ...{ + if (hasDifferentName) ...{ 'name': refer("'$propertyName'"), }, - if (propertySchema.isJsonString) ...{ - 'fromJson': refer('${result.name}.fromJsonString'), - 'toJson': refer('${result.name}.toJsonString'), + if (isJsonString || isJsonStringArray) ...{ + 'fromJson': refer(fromJson), + 'toJson': refer(toJson), }, - if (extraJsonKeyValues != null && extraJsonKeyValues.containsKey(propertyName)) ...{ + if (hasExtraJsonKeyValues) ...{ for (final key in extraJsonKeyValues[propertyName]!.keys) ...{ key: refer(extraJsonKeyValues[propertyName]![key]!), }, diff --git a/packages/dynamite/lib/src/type_result/list.dart b/packages/dynamite/lib/src/type_result/list.dart index 2208a834..3b7685de 100644 --- a/packages/dynamite/lib/src/type_result/list.dart +++ b/packages/dynamite/lib/src/type_result/list.dart @@ -20,7 +20,7 @@ class TypeResultList extends TypeResult { final String? mimeType, }) { if (onlyChildren) { - return '$object.map((final e) => ${subType.encode('e')}).toList()'; + return '$object.map((final e) => ${subType.encode('e', mimeType: mimeType)}).toList()'; } switch (mimeType) { diff --git a/packages/dynamite/lib/src/type_result/object.dart b/packages/dynamite/lib/src/type_result/object.dart index 40f09d62..65eeb365 100644 --- a/packages/dynamite/lib/src/type_result/object.dart +++ b/packages/dynamite/lib/src/type_result/object.dart @@ -11,7 +11,7 @@ class TypeResultObject extends TypeResult { @override String serialize(final String object) { if (fromJsonString) { - return '$object.toJsonString()'; + return '$name.toJsonString($object)'; } return '$object.toJson()'; }