用json_serializable解析未知键HTTP响应JSON并转为对象列表
解决动态键JSON的解析问题(Flutter json_serializable)
方案一:创建仅含Map的DTO类
完全可以创建只持有动态键值对Map的DTO类,完美适配后端返回的未知键结构。代码示例如下:
import 'package:json_annotation/json_annotation.dart'; part 'dynamic_response.g.dart'; @JsonSerializable() class DynamicResponse { final Map<String, String> data; DynamicResponse(this.data); factory DynamicResponse.fromJson(Map<String, dynamic> json) => _$DynamicResponseFromJson(json); Map<String, dynamic> toJson() => _$DynamicResponseToJson(this); }
解析时直接把整个JSON对象传给DynamicResponse.fromJson,后端返回的所有键值对都会被映射到data字段里,之后你可以通过response.data['12-34']这类方式访问对应值。
方案二:转成ResponseState列表
你给出的ResponseState类对应单个条目(number是键、message是值),但后端返回的是一个键值对对象,没法直接用fromJson解析成列表,得手动遍历处理:
先完善你的ResponseState类:
import 'package:json_annotation/json_annotation.dart'; part 'response_state.g.dart'; @JsonSerializable() class ResponseState { final String number; final String message; ResponseState({required this.number, required this.message}); factory ResponseState.fromJson(Map<String, dynamic> json) => _$ResponseStateFromJson(json); Map<String, dynamic> toJson() => _$ResponseStateToJson(this); }
然后解析原JSON,先转成Map<String, dynamic>,再遍历键值对生成ResponseState实例并组成列表:
// 假设httpResponse是你的HTTP响应内容 final Map<String, dynamic> jsonData = jsonDecode(httpResponse.body); List<ResponseState> stateList = jsonData.entries.map((entry) { return ResponseState( number: entry.key, message: entry.value.toString(), ); }).toList();
这里不需要用到ResponseState.fromJson,因为原JSON的每个键值对并非包含number和message的对象,而是键本身就是number,值就是message,直接用构造函数创建实例更直接。
内容的提问来源于stack exchange,提问作者Th.Fr.
相关产品推荐
相关产品推荐

