如何在 Flutter 中正确处理 json 数组?

dar*_*tar 1 dart flutter

所以基本上我是使用 flutter 中的 http 包从 api 获取数据。response.body 是一个如下所示的数组:

[
   {
      "id":1,
      "full_name":"Cristiano Ronaldo",
      "avatar":"http://localhost:8000/media/avatars/Ronaldo.jpeg",
      "created":"2021-06-30T02:25:56.332816Z"
   },
   {
      "id":2,
      "full_name":"Paul Pogba",
      "avatar":"http://localhost:8000/media/avatars/Pogba.jpeg",
      "created":"2021-06-30T02:49:17.649970Z"
   },
   {
      "id":3,
      "full_name":"Paulo Dybala",
      "avatar":"http://localhost:8000/media/avatars/Dybala.jpeg",
      "created":"2021-06-30T02:52:33.338296Z"
   },
   {
      "id":4,
      "full_name":"Leonel Messi",
      "avatar":"http://localhost:8000/media/avatars/Messi.jpeg",
      "created":"2021-06-30T02:53:39.539556Z"
   },
   {
      "id":5,
      "full_name":"Kylian Mbappe",
      "avatar":"http://localhost:8000/media/avatars/Mbappe.jpeg",
      "created":"2021-06-30T02:57:29.891686Z"
   }
]
Run Code Online (Sandbox Code Playgroud)

我的问题是我想基本上将其格式化为“dart”方式。像这样的事情:

List players = response.body;
Run Code Online (Sandbox Code Playgroud)

我收到的错误是这样的

A value of type 'String' can't be assigned to a variable of type 'List<dynamic>'.
Try changing the type of the variable, or casting the right-hand type to 'List<dynamic>'.
Run Code Online (Sandbox Code Playgroud)

为什么会出现这个错误。我知道列表已经正确格式化,并且 json 对象的键值对都是字符串,但我想将其格式化为“dart”方式。如果我这样做:

var players = response.body;
Run Code Online (Sandbox Code Playgroud)

它确实有效。我应该只使用 var 并称之为好还是应该格式化它?

附带问题: 如果我想在 initState 方法中调用从 api 获取数据的方法,我会这样做:

Future<void> _getPlayers() async {
   ...
} 

void initState() {
   super.initState();
   _getPlayers();
}
Run Code Online (Sandbox Code Playgroud)

谢谢你!

Kis*_*cha 6

有很多方法可以做到这一点

Object最有效的方法是像这样制作

class Player {
  final int id;
  final String fullName;
  final String avatar;
  final String created;

  const Player({this.id, this.fullName, this.avatar, this.created});

  Player.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    fullName = json['full_name'];
    avatar = json['avatar'];
    created = json['created'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['full_name'] = this.fullName;
    data['avatar'] = this.avatar;
    data['created'] = this.created;
    return data;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以增加价值

  • 而不是像这样
List players = response.body
Run Code Online (Sandbox Code Playgroud)
  • 你可以这样使用
var data = json.decode(response.body);

List<Player> players  = data.map((element){
   return Player.fromJson(element);
}).toList();
Run Code Online (Sandbox Code Playgroud)

players用于从列表访问数据

  • 你可以这样做
players[0].fullName;
players[1].fullName;
Run Code Online (Sandbox Code Playgroud)