我得到一个 json
响应示例格式如下
// call 1 : /all-users
{
"success": true,
"message": "All Users list",
"data": [{
"code": "USR001",
"name": "User One"
}]
}
// call 2 - /user-details/USR001
{
"success": true,
"message": "User Details of USR001",
"data": {
"code": "USR001",
"firstName": "User",
"lastName": "One",
"email": "userOne@email.com",
}
}
还有我的 ApiResponse
模型是class ApiResponse {
bool success;
String message;
List<Data> data;
ApiResponse({this.success, this.message, this.data});
ApiResponse.fromJson(Map<String, dynamic> json) {
success = json['success'];
message = json['message'];
if (json['data'] != null) {
data = new List<Data>();
json['data'].forEach((v) {
data.add(new Data.fromJson(v));
});
}
}
}
data
在响应中可能是一个对象或数组取决于调用。我想重用 ApiResponse
通过扩展 data
为两个调用建立模型作为单独的模型。但我不知道该怎么做。
最佳答案
我认为最简单的方法是简单地拥有两个扩展 ApiResponse
的类。 ,并且两者都可以调用您的 super.fromJson。由于数据会有所不同,您可以执行以下两种操作之一:
data
导出到新的派生类中,并在它们的构造函数中单独解析它 ApiResponse
进入具有泛型的类( ApiResponse<T>
,其中 data
的类型为 T
)。如果您采用这种方法,您还必须传递一个可以解析数据 json 的函数。 就我个人而言,我认为为此使用泛型有点矫枉过正,但我想提一下它作为一种可能的解决方案。考虑到这一点,您可以执行以下操作:
class ApiResponseBase {
bool success;
String message;
ApiResponse({this.success, this.message});
ApiResponse.fromJson(Map<String, dynamic> json) {
success = json['success'];
message = json['message'];
}
}
class ApiResponseArray extends ApiResponseBase {
List<Data> data;
ApiResponseArray.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
if (json['data'] != null) {
json['data'].forEach((v) {
data.add(new Data.fromJson(v));
});
}
}
}
class ApiResponseObject extends ApiResponseBase {
Data data;
ApiResponseObject.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
if (json['data'] != null) {
data = new Data.fromJson(json['data']);
}
}
}
请注意我是如何从 ApiResponseBase
中删除数据的因为它现在正在派生类中解析。如果你真的不喜欢现在有两种数据定义的事实,你可以使用泛型而不需要增加复杂性:
class ApiResponseBase<T> {
bool success;
String message;
T data;
// same as before
}
class ApiResponseArray extends ApiResponseBase<List<Data>> {
// same as before
}
class ApiResponseObject extends ApiResponseBase<Data> {
// same as before
}
但无论哪种方式都有效。
关于flutter - 如何重用模型作为父模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642039/