我有一个来自这样的 http 请求的通用响应结构
class CommonResponse<T> {
int total;
List<T> data;
bool success;
CommonResponse({this.total, this.data, this.success});
CommonResponse.fromJson(Map<String, dynamic> json) {
total = json['total'];
data = json['data'];
success = json['success'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['total'] = this.total;
data['data'] = this.data;
data['success'] = this.success;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要解析通用数据。例如,我正在获取数据对象内的区域列表CommonResponse
class Zone {
bool active;
String id;
String name;
Zone({this.active, this.id, this.name});
Zone.fromJson(Map<String, dynamic> json) {
this.active = json['active'];
this.id = json['id'];
this.name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['active'] = this.active;
data['id'] = this.id;
data['name'] = this.name;
}
}
Run Code Online (Sandbox Code Playgroud)
如何获取区域列表?
var response = {
"data": [
{
"active": true,
"created_on": "2020-03-12T09:56:11+00:00",
"description": "For Testing",
"id": "b17627eb-8a39-4230-80fe-ebed77f7e0e2",
"name": "Office",
"updated_on": "2020-03-19T12:26:16+00:00"
}
],
"success": true,
"total": 1
};
CommonResponse<Zone> common = CommonResponse.fromJson(response);
print(common.data);
Run Code Online (Sandbox Code Playgroud)
这是我试过的。我得到了完美的回应,但在获取Zone. 错误是无法转换List<dynamic>为Zone.
Owc*_*zar 10
要生成从 json 到 json 的正确转换,您可以使用json_serializable包。它通过@JsonSerializable(genericArgumentFactories: true).
首先让我们进行小代码重构:
将Zone班级移至zone.dart:
import 'package:json_annotation/json_annotation.dart';
part 'zone.g.dart';
@JsonSerializable()
class Zone {
bool active;
String id;
String name;
Zone({this.active, this.id, this.name});
factory Zone.fromJson(Map<String, dynamic> json) => _$ZoneFromJson(json);
Map<String, dynamic> toJson() => _$ZoneToJson(this);
}
Run Code Online (Sandbox Code Playgroud)
CommonResponse 上课到 common_response.dart
import 'package:json_annotation/json_annotation.dart';
part 'common_response.g.dart';
@JsonSerializable(genericArgumentFactories: true)
class CommonResponse<T> {
int total;
List<T> data;
bool success;
CommonResponse({this.total, this.data, this.success});
factory CommonResponse.fromJson(
Map<String, dynamic> json,
T Function(Object json) fromJsonT,
) =>
_$CommonResponseFromJson(json, fromJsonT);
Map<String, dynamic> toJson(Object Function(T value) toJsonT) =>
_$CommonResponseToJson(this, toJsonT);
}
Run Code Online (Sandbox Code Playgroud)
并运行flutter pub run build_runner build。
输出如下:
zone.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'zone.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Zone _$ZoneFromJson(Map<String, dynamic> json) {
return Zone(
active: json['active'] as bool,
id: json['id'] as String,
name: json['name'] as String,
);
}
Map<String, dynamic> _$ZoneToJson(Zone instance) => <String, dynamic>{
'active': instance.active,
'id': instance.id,
'name': instance.name,
};
Run Code Online (Sandbox Code Playgroud)
common_response.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'common_response.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
CommonResponse<T> _$CommonResponseFromJson<T>(
Map<String, dynamic> json,
T Function(Object json) fromJsonT,
) {
return CommonResponse<T>(
total: json['total'] as int,
data: (json['data'] as List)?.map(fromJsonT)?.toList(),
success: json['success'] as bool,
);
}
Map<String, dynamic> _$CommonResponseToJson<T>(
CommonResponse<T> instance,
Object Function(T value) toJsonT,
) =>
<String, dynamic>{
'total': instance.total,
'data': instance.data?.map(toJsonT)?.toList(),
'success': instance.success,
};
Run Code Online (Sandbox Code Playgroud)
示例用法:
import 'package:json_annotation/json_annotation.dart';
part 'zone.g.dart';
@JsonSerializable()
class Zone {
bool active;
String id;
String name;
Zone({this.active, this.id, this.name});
factory Zone.fromJson(Map<String, dynamic> json) => _$ZoneFromJson(json);
Map<String, dynamic> toJson() => _$ZoneToJson(this);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |