返回

简化Flutter中的JSON转模型

IOS

Flutter简化JSON转模型

作为刚接触Flutter的iOS开发人员,JSON转模型一直是让我头疼的部分。通常有两种方法:

1. 传统方式:

手动创建fromJson()方法并逐个赋值。虽然可靠,但很繁琐,尤其对于庞大模型。

2. 代码生成:

使用第三方库(例如json_serializable)自动生成fromJson()方法。虽然更方便,但会增加编译时间和代码大小。

这里提供一个替代方案,既保留了传统方式的可靠性,又简化了代码:

步骤:

  1. 创建基类:
abstract class BaseModel {
  Map<String, dynamic> toJson();
}
  1. 在模型中实现toJson():

让您的模型继承BaseModel并实现toJson()方法。这个方法返回一个包含模型数据的Map。

class User extends BaseModel {
  String name;
  int age;

  @override
  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
    };
  }
}
  1. 使用通用fromJson():

编写一个通用的fromJson()方法,接收类型T和Map<String, dynamic>。

T fromJson<T extends BaseModel>(Map<String, dynamic> json) {
  // 从json中获取T的类型参数
  final type = T;

  // 创建T的实例
  final instance = type.newInstance(symbol: #new);

  // 使用反射给instance的属性赋值
  instance.fields.forEach((field) {
    if (json.containsKey(field.name)) {
      field.set(#setter, instance, [json[field.name]]);
    }
  });

  return instance;
}

用法:

要将JSON转换为模型,只需调用通用fromJson()方法,如下所示:

User user = fromJson<User>(json);

优势:

  • 易用性: 无需手动创建fromJson()方法或使用代码生成。
  • 可靠性: 使用反射进行赋值,确保准确性。
  • 可扩展性: 通用fromJson()方法可用于任何实现BaseModel的模型。
  • 灵活性: 仍可以使用反射访问和修改模型的属性。

提示:

  • 确保模型类具有合适的构造函数(例如带有命名参数的构造函数)。
  • 对于复杂模型,可能需要使用额外的转换逻辑。

通过这种方法,您可以在Flutter中更轻松、更有效地实现JSON到模型的转换。