将 Flutter Freezed 字段名称重命名为 Snake、Pascal、Kebab 或其他类似名称

Mu'*_*suf 1 dart flutter json-serializable freezed

发布这个问题是为了我自己回答。希望这对某人有帮助。

问题:使用 flutter 生成代码freezed,但将 json 字段名称更改为特定的重命名模式。

Mu'*_*suf 6

解决方案:

build.yaml

假设你有一个freezed这样写的类

import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:convert';

part 'my_calss.freezed.dart';
part 'my_calss.g.dart';

@freezed
abstract class MyCalss with _$MyCalss {
    const factory MyCalss({
        @required int field1,
        @required String field2,
    }) = _MyCalss;

    factory MyCalss.fromJson(Map<String, dynamic> json) => _$MyCalssFromJson(json);
}


Run Code Online (Sandbox Code Playgroud)

更改要使用的类my_calss.g.dart,例如pascal

将以下内容放入您的build.yaml

# targets:
#   $default:
#     builders:
#       freezed:
#         options:
#           union_key: type
#           union_value_case: pascal

targets:
  $default:
    builders:
      json_serializable:
        options:
          # Options configure how source code is generated for every
          # `@JsonSerializable`-annotated class in the package.
          #
          # The default value for each is listed.
          any_map: false
          checked: false
          constructor: ""
          create_factory: true
          create_field_map: false
          create_to_json: true
          disallow_unrecognized_keys: false
          explicit_to_json: false
          field_rename: pascal
          generic_argument_factories: false
          ignore_unannotated: false
          include_if_null: true
Run Code Online (Sandbox Code Playgroud)

主要感兴趣的字段可以是下面列出的field_rename枚举中的任何FieldRenamejson_serializable


/// Values for the automatic field renaming behavior for [JsonSerializable].
enum FieldRename {
  /// Use the field name without changes.
  none,

  /// Encodes a field named `kebabCase` with a JSON key `kebab-case`.
  kebab,

  /// Encodes a field named `snakeCase` with a JSON key `snake_case`.
  snake,

  /// Encodes a field named `pascalCase` with a JSON key `PascalCase`.
  pascal,

  /// Encodes a field named `screamingSnakeCase` with a JSON key
  /// `SCREAMING_SNAKE_CASE`
  screamingSnake,
}
Run Code Online (Sandbox Code Playgroud)

最初,我在这里找到了这个 github 页面,上面说要执行以下操作

However, when I write this, there is an error (when I checked the generated file, it was generated twice)
@freezed
@JsonSerializable(fieldRename: FieldRename.snake)
class Example with _$Example {
  factory Example() = GeneratedClass;
}
So rewriting it this way works fine.
@freezed
class Example with _$Example {
  @JsonSerializable(fieldRename: FieldRename.snake)
  factory Example() = GeneratedClass;
}
Run Code Online (Sandbox Code Playgroud)

这些解决方案都没有帮助我,只有编辑build.yaml文件才能解决问题。

我正在使用的版本

  #Freezed 
  freezed_annotation: ^2.1.0
 #json annotations
  json_annotation: ^4.6.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.2.0
  flutter_lints: ^2.0.1
  freezed: ^2.1.0+1
  json_serializable: ^6.3.1

Run Code Online (Sandbox Code Playgroud)


bar*_*ley 5

事实上,我找到了一个更简单的方法。它可能是新的,但也有一些记录,如何将冻结与 JsonSerialized 表示法混合。

\n

https://pub.dev/packages/freezed(查找 \xe2\x80\x9d @JsonSerialized 注释怎么样?\xe2\x80\x9d 部分)

\n

这种代码对我来说就像魅力一样。

\n
@freezed\nclass Account with _$Account {\n  // ignore: invalid_annotation_target\n  @JsonSerializable(fieldRename: FieldRename.snake)\n  const factory Account(\n      {required int? id,\n      required int? userId, // snake case to camel case conversion works\n      required String? name,\n      required int? balance}) = _Account;\n\n  factory Account.fromJson(Map<String, dynamic> json) =>\n      _$AccountFromJson(json);\n}\n
Run Code Online (Sandbox Code Playgroud)\n