【问题标题】:Flutter/Dart Json ParsingFlutter/Dart Json 解析
【发布时间】:2025-11-26 21:45:01
【问题描述】:

我正在尝试解析这种类型的 json:

    "teams": [
        {
            "id": 1,
            "name": "New Jersey Devils",
            "link": "/api/v1/teams/1",
            "venue": {
                "name": "Prudential Center",
                "link": "/api/v1/venues/null",
                "city": "Newark",
                "timeZone": {
                    "id": "America/New_York",
                    "offset": -4,
                    "tz": "EDT"
                }
            },
            "abbreviation": "NJD",
            "teamName": "Devils",
            "locationName": "New Jersey",
            "firstYearOfPlay": "1982",
            "division": {
                "id": 18,
                "name": "Metropolitan",
                "nameShort": "Metro",
                "link": "/api/v1/divisions/18",
                "abbreviation": "M"
            }.........

但我只想要 'id''name' 属性。
这是我的模型:

class TeamDetail{
  final int id;
  final String name;

  TeamDetail({this.id, this.name});

  factory TeamDetail.fromJson(Map<String, dynamic> json){
    return TeamDetail(
      id: json["id"],
      name: json["name"],
    );
  }
}

还有我的方法:

Future<TeamDetail> getTeamDetail() async{
  final response = await http.get('https://statsapi.web.nhl.com/api/v1/teams/1');

  if(response.statusCode == 200){

    return TeamDetail.fromJson(json.decode(response.body));

  }else{
    throw Exception("Failed to load");
  }
}

但是当我调用该方法时,我总是收到一个空值。你能帮我吗。 谢谢

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以复制粘贴运行完整的代码打击
    你可以回List&lt;TeamDetail&gt;
    代码sn-p

    Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));
    ...
    factory Payload.fromJson(Map<String, dynamic> json) => Payload(
            copyright: json["copyright"],
            teams: List<TeamDetail>.from(
                json["teams"].map((x) => TeamDetail.fromJson(x))),
          );
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    import 'dart:convert';
    
    Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));
    
    class Payload {
      Payload({
        this.copyright,
        this.teams,
      });
    
      String copyright;
      List<TeamDetail> teams;
    
      factory Payload.fromJson(Map<String, dynamic> json) => Payload(
            copyright: json["copyright"],
            teams: List<TeamDetail>.from(
                json["teams"].map((x) => TeamDetail.fromJson(x))),
          );
    }
    
    class TeamDetail {
      TeamDetail({
        this.id,
        this.name,
      });
    
      int id;
      String name;
    
      factory TeamDetail.fromJson(Map<String, dynamic> json) => TeamDetail(
            id: json["id"],
            name: json["name"],
          );
    }
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
      Future<List<TeamDetail>> _future;
    
      Future<List<TeamDetail>> getTeamDetail() async {
        final response =
            await http.get('https://statsapi.web.nhl.com/api/v1/teams/1');
    
        if (response.statusCode == 200) {
          var payload = payloadFromJson(response.body);
          return payload.teams;
        } else {
          throw Exception("Failed to load");
        }
      }
    
      @override
      void initState() {
        _future = getTeamDetail();
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text(widget.title),
            ),
            body: FutureBuilder(
                future: _future,
                builder: (context, AsyncSnapshot<List<TeamDetail>> snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.none:
                      return Text('none');
                    case ConnectionState.waiting:
                      return Center(child: CircularProgressIndicator());
                    case ConnectionState.active:
                      return Text('');
                    case ConnectionState.done:
                      if (snapshot.hasError) {
                        return Text(
                          '${snapshot.error}',
                          style: TextStyle(color: Colors.red),
                        );
                      } else {
                        return ListView.builder(
                            itemCount: snapshot.data.length,
                            itemBuilder: (context, index) {
                              return Card(
                                  elevation: 6.0,
                                  child: Padding(
                                    padding: const EdgeInsets.only(
                                        top: 6.0,
                                        bottom: 6.0,
                                        left: 8.0,
                                        right: 8.0),
                                    child: Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      children: <Widget>[
                                        Text(snapshot.data[index].id.toString()),
                                        Spacer(),
                                        Text(snapshot.data[index].name),
                                      ],
                                    ),
                                  ));
                            });
                      }
                  }
                }));
      }
    }
    

    【讨论】: