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

Flutter中如何访问嵌套JSON文件里nutrient的name字段?

解决嵌套JSON中nutrient.name的访问问题

你之前的代码无法访问nutrient.name的核心原因是:foodNutrients是数组(List)类型,不是单个对象,不能直接通过['foodNutrients']['nutrient']的方式访问,必须先指定数组元素的索引,或者遍历整个数组。

方案1:显示第一个营养元素的名称

如果只需要展示foodNutrients数组里第一个元素的nutrient.name,可以修改ListTile的subtitle字段:

subtitle: Text(_items[index]['foodNutrients'][0]['nutrient']['name']),

方案2:显示所有营养元素的名称

如果需要展示该食物的全部营养名称,可以在Card内添加Column组件遍历foodNutrients数组:

return Card(
  margin: const EdgeInsets.all(10),
  child: Padding(
    padding: const EdgeInsets.all(12),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        ListTile(
          leading: Text(_items[index]['foodClass']),
          title: Text(_items[index]['description']),
        ),
        const SizedBox(height: 8),
        const Text('营养成分:'),
        // 遍历数组,逐个渲染营养名称
        ...(_items[index]['foodNutrients'] as List).map((nutrientItem) {
          return Text('- ${nutrientItem['nutrient']['name']}');
        }).toList(),
      ],
    ),
  ),
);

完整修改后的代码片段

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:flutter/services.dart';

class HomeScreen2 extends StatefulWidget {
  const HomeScreen2({Key? key}) : super(key: key);

  @override
  State<HomeScreen2> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen2> {
  List _items = [];

  Future<void> readJson() async {
    final String response = await rootBundle.loadString('assets/database.json');
    final data = await json.decode(response);
    setState(() {
      _items = data["SRLegacyFoods"];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: const Text('Database'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(25),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: readJson,
              child: const Text('Load Data'),
            ),
            _items.isNotEmpty
                ? Expanded(
                    child: ListView.builder(
                      itemCount: 3,
                      itemBuilder: (context, index) {
                        return Card(
                          margin: const EdgeInsets.all(10),
                          child: Padding(
                            padding: const EdgeInsets.all(12),
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                ListTile(
                                  leading: Text(_items[index]['foodClass']),
                                  title: Text(_items[index]['description']),
                                ),
                                const SizedBox(height: 8),
                                const Text('营养成分:'),
                                ...(_items[index]['foodNutrients'] as List).map((nutrientItem) {
                                  return Text('- ${nutrientItem['nutrient']['name']}');
                                }).toList(),
                              ],
                            ),
                          ),
                        );
                      },
                    ),
                  )
                : Container()
          ],
        ),
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:17:41