feat: support json_serializable configuration (checked, explicit_to_json) in generated models

This commit is contained in:
Max 2025-12-12 11:25:57 +08:00
parent 0b20ad6ab5
commit 1231af9f0b
5 changed files with 57 additions and 12 deletions

View File

@ -558,7 +558,7 @@ packages:
path: ".."
relative: true
source: path
version: "3.1.0"
version: "3.1.4"
term_glyph:
dependency: transitive
description:

View File

@ -54,6 +54,10 @@ class SwaggerConfig {
static Map<String, Map<dynamic, EnumKeyMapping>>? get enumKeyMappings =>
ConfigRepository.loadSync().enumKeyMappings;
/// JsonSerializable
static JsonSerializableConfig? get jsonSerializableConfig =>
ConfigRepository.loadSync().jsonSerializableConfig;
///
static const String defaultDocumentationFile =
'generated_api_documentation.md';

View File

@ -17,6 +17,28 @@ class EnumKeyMapping {
final String? description;
}
/// JSON Serializable
class JsonSerializableConfig {
const JsonSerializableConfig({
this.checked = false,
this.explicitToJson = false,
this.includeIfNull = true,
});
final bool checked;
final bool explicitToJson;
final bool includeIfNull;
static JsonSerializableConfig? fromMap(Map<String, dynamic>? map) {
if (map == null) return null;
return JsonSerializableConfig(
checked: map['checked'] as bool? ?? false,
explicitToJson: map['explicit_to_json'] as bool? ?? false,
includeIfNull: map['include_if_null'] as bool? ?? true,
);
}
}
///
///
class ConfigRepository {
@ -292,6 +314,15 @@ class ConfigRepository {
return api?['base_page_result_import'] as String? ?? '';
}
/// JsonSerializable
JsonSerializableConfig? get jsonSerializableConfig {
final generation = _config['generation'] as Map<String, dynamic>?;
final models = generation?['models'] as Map<String, dynamic>?;
final jsonSerializable =
models?['json_serializable'] as Map<String, dynamic>?;
return JsonSerializableConfig.fromMap(jsonSerializable);
}
///
/// : { "EnumName": { value: { "name": "KEY_NAME", "description": "描述" } } }
Map<String, Map<dynamic, EnumKeyMapping>>? get enumKeyMappings {

View File

@ -127,6 +127,18 @@ String _generateAnnotatedModelCodeWithoutImports(
buffer.writeln(StringHelper.generateComment(model.description));
}
final jsonConfig = SwaggerConfig.jsonSerializableConfig;
if (jsonConfig != null) {
final params = <String>[];
if (jsonConfig.checked) params.add('checked: true');
if (jsonConfig.explicitToJson) params.add('explicitToJson: true');
if (!jsonConfig.includeIfNull) params.add('includeIfNull: false');
if (params.isNotEmpty) {
buffer.writeln('@JsonSerializable(${params.join(', ')})');
}
}
buffer
..writeln('@freezed')
..writeln('abstract class $className with _\$$className {')

View File

@ -44,19 +44,17 @@ String buildSingleModelFile(
..writeln();
if (!model.isEnum) {
buffer
..writeln(
"import 'package:freezed_annotation/freezed_annotation.dart';",
)
..writeln();
} else {
buffer
..writeln(
"import 'package:json_annotation/json_annotation.dart';",
)
..writeln();
buffer.writeln(
"import 'package:freezed_annotation/freezed_annotation.dart';",
);
}
buffer
..writeln(
"import 'package:json_annotation/json_annotation.dart';",
)
..writeln();
final importedTypes = generator.getImportedTypes(model);
if (importedTypes.isNotEmpty) {
buffer