You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:07:21