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

Flutter开发中如何获取并展示JSON结构Data下的DietName字段

实现步骤

1. 先确认接口返回JSON结构(参考示例)

通常这类接口返回结构如下,可对照你实际的返回调整字段匹配规则

{
  "code": 200,
  "msg": "请求成功",
  "Data": {
    "DietName": "注册营养师李XX",
    "PartnerData": [
      // 你已能正常解析的数组内容
    ]
  }
}

2. 确认模型类定义正确

需确保根模型DietDetailsModel已绑定根节点下的Data对象,且Data类中已声明DietName对应字段,以下是用json_serializable序列化的示例:

DietDetailsModel定义

import 'package:json_annotation/json_annotation.dart';
part 'diet_details_model.g.dart';

@JsonSerializable()
class DietDetailsModel {
  final int code;
  final String msg;
  // 如果JSON中key是大写开头的Data,需用@JsonKey指定映射
  @JsonKey(name: 'Data')
  final Data data;

  DietDetailsModel({
    required this.code,
    required this.msg,
    required this.data,
  });

  factory DietDetailsModel.fromJson(Map<String, dynamic> json) =>
      _$DietDetailsModelFromJson(json);
}

Data类定义

@JsonSerializable()
class Data {
  // 匹配JSON中大写开头的DietName字段
  @JsonKey(name: 'DietName')
  final String dietName;
  @JsonKey(name: 'PartnerData')
  final List<PartnerData> partnerData;

  Data({
    required this.dietName,
    required this.partnerData,
  });

  factory Data.fromJson(Map<String, dynamic> json) => _$DataFromJson(json);
}

// 你已定义的PartnerData类保持原有逻辑即可

如果是手动写序列化逻辑,确保Data.fromJson中已正确赋值dietName:

factory Data.fromJson(Map<String, dynamic> json) {
  return Data(
    dietName: json['DietName'] as String,
    partnerData: (json['PartnerData'] as List)
        .map((item) => PartnerData.fromJson(item))
        .toList(),
  );
}

3. 页面展示DietName字段

接口请求解析得到DietDetailsModel实例后,直接通过层级调用获取字段即可,示例(用FutureBuilder演示):

class DietDetailsPage extends StatefulWidget {
  const DietDetailsPage({super.key});

  @override
  State<DietDetailsPage> createState() => _DietDetailsPageState();
}

class _DietDetailsPageState extends State<DietDetailsPage> {
  late Future<DietDetailsModel> _detailsFuture;

  @override
  void initState() {
    super.initState();
    // 调用你的接口请求方法,解析得到DietDetailsModel实例
    _detailsFuture = requestDietDetailsApi();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<DietDetailsModel>(
        future: _detailsFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done &&
              snapshot.hasData) {
            final details = snapshot.data!;
            return Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                // 直接通过层级调用获取DietName展示
                Padding(
                  padding: const EdgeInsets.all(16),
                  child: Text(
                    details.data.dietName,
                    style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                  ),
                ),
                // 你原有展示PartnerData数组的逻辑保持不变
                Expanded(
                  child: ListView.builder(
                    itemCount: details.data.partnerData.length,
                    itemBuilder: (context, index) {
                      final item = details.data.partnerData[index];
                      // 返回你原有PartnerData的item组件
                      return PartnerItemWidget(data: item);
                    },
                  ),
                )
              ],
            );
          }
          return const Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}

注意事项

  • 模型字段映射必须和接口返回的JSON key完全一致,大小写、拼写不能有差异
  • 若接口返回的DietName可能为空,需将模型中对应字段声明为可空类型String?,展示时做判空处理

内容的提问来源于stack exchange,提问作者Toujo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:36:01