FlutterJsonBeanFactory icon indicating copy to clipboard operation
FlutterJsonBeanFactory copied to clipboard

生成文件格式化;添加yaml可配置是否兼容json_serializable;支持泛型解析;

Open wittyneko opened this issue 3 years ago • 3 comments

  1. 生成文件原本空格和tab混用统一改为空格,样式小调整更接近 dart format格式化结果。
  2. 在 #114 基础上添加pubspec.yaml兼容配置json_serializable_compattrue才启用json_serializable兼容模式,没配置默认不启用。

wittyneko avatar May 06 '22 22:05 wittyneko

json_serializable兼容模式的Json支持泛型解析 生成格式为json_serializable兼容格式加入了Json泛型支持。

可以生成带泛型的Json对象
例如:

import 'dart:convert';
import 'package:json_annotation/json_annotation.dart';
import 'package:erp/generated/json/base/json_convert_content.dart';

part 'base_result_entity.g.dart';

@JsonSerializable()
class BaseResultEntity<T> {
  int code = 0;
  bool success = false;
  String? message;
  late T result;

  BaseResultEntity();

  factory BaseResultEntity.fromJson(Map<String, dynamic> json) =>
      _$BaseResultEntityFromJson(json, JsonConvert.fromJsonFactory);

  Map<String, dynamic> toJson() => _$BaseResultEntityToJson(this, (value) => value);

  @override
  String toString() {
    return jsonEncode(this);
  }
}

对应生成结果为:

part of 'base_result_entity.dart';

BaseResultEntity<T> _$BaseResultEntityFromJson<T>(Map<String, dynamic> json, T Function(Object? json) fromJsonT) {
  final BaseResultEntity<T> baseResultEntity = BaseResultEntity<T>();
  final int? code = jsonConvert.convert<int>(json['code']);
  if (code != null) {
    baseResultEntity.code = code;
  }
  final bool? success = jsonConvert.convert<bool>(json['success']);
  if (success != null) {
    baseResultEntity.success = success;
  }
  final String? message = jsonConvert.convert<String>(json['message']);
  if (message != null) {
    baseResultEntity.message = message;
  }
  final T? result = jsonConvert.convert<T>(json['result']);
  if (result != null) {
    baseResultEntity.result = result;
  }
  return baseResultEntity;
}

Map<String, dynamic> _$BaseResultEntityToJson<T>(BaseResultEntity<T> entity, Object? Function(T value) toJsonT) {
  final Map<String, dynamic> data = <String, dynamic>{};
  data['code'] = entity.code;
  data['success'] = entity.success;
  data['message'] = entity.message;
  data['result'] = toJsonT(entity.result);
  return data;
}

wittyneko avatar May 07 '22 13:05 wittyneko

emmm 其实我认真想了下 不准备兼容json_serializable 一个项目里 感觉出现一个就够了 要不就完全迁移到其中一个去 对于保留2个的 我感觉很扯啊 ... 不过对于泛型的支持和缩进 我准备会合进去的

zhangruiyu avatar May 09 '22 04:05 zhangruiyu

这个兼容是一方面是开发有时候用VSCode,改了内容没法生成可以用json_serializable替代下。 另一方面是注解改成了json_annotation,为了隐藏生成的函数名import 改成了part ,要写升级逻辑太麻烦了。

wittyneko avatar May 09 '22 05:05 wittyneko