Mu'*_*suf 1 dart flutter json-serializable freezed
发布这个问题是为了我自己回答。希望这对某人有帮助。
问题:使用 flutter 生成代码freezed,但将 json 字段名称更改为特定的重命名模式。
解决方案:
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枚举中的任何FieldRename值json_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)
事实上,我找到了一个更简单的方法。它可能是新的,但也有一些记录,如何将冻结与 JsonSerialized 表示法混合。
\nhttps://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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2434 次 |
| 最近记录: |