25

How to encode list to json?

This is my class for Json.

class Players{
  List<Player> players;

  Players({this.players});

  factory Players.fromJson(List<dynamic> parsedJson){

    List<Player> players = List<Player>();
    players = parsedJson.map((i)=>Player.fromJson(i)).toList();

    return Players(
      players: players,
    );
  }
}

class Player{
  final String name;
  final String imagePath;
  final int totalGames;
  final int points;

  Player({this.name,this.imagePath, this.totalGames, this.points});

  factory Player.fromJson(Map<String, dynamic> json){

    return Player(
      name: json['name'],
      imagePath: json['imagePath'],
      totalGames: json['totalGames'],
      points: json['points'],
    );
  }
}

I managed to decode with fromJson, the result is in List. Now that I have another player to add in json and want to encode the list to json, have no idea to do it. It result always failed.

var json = jsonDecode(data);
List<Player> players = Players.fromJson(json).players;
Player newPlayer = Player(name: _textEditing.text,imagePath: _imagePath,totalGames: 0,points: 0);
players.add(newPlayer);
String encode = jsonEncode(players.players);

What do I need to add on Players or Player?

tomerpacific
  • 4,704
  • 13
  • 34
  • 52
willy wijaya
  • 692
  • 3
  • 8
  • 18
  • Your code is incorrect. The `players` variable is of type `List`. Accordingly, this code `players.players` will not work, because `List` does not have a `players` field. – mezoni Jun 05 '19 at 08:46

3 Answers3

36

Add toJson method to your Player class:

Map<String, dynamic> toJson(){
  return {
    "name": this.name,
    "imagePath": this.imagePath,
    "totalGames": this.totalGames,
    "points": this.points
  };
}

Then you can call jsonEncode on the list of players:

String encoded = jsonEncode(players) // this will automatically call toJson on each player
Sami Haddad
  • 1,356
  • 10
  • 15
Sami Kanafani
  • 14,244
  • 6
  • 45
  • 41
17

Add on class:

Map<String,dynamic> toJson(){
    return {
        "name": this.name,
        "imagePath": this.imagePath,
        "totalGames": this.totalGames,
        "points": this.points
    };
  }

and call

String json = jsonEncode(players.map((i) => i.toJson()).toList()).toString();
Lucio Pelinson
  • 430
  • 5
  • 7
7
List jsonList = players.map((player) => player.toJson()).toList();
print("jsonList: ${jsonList}");
FreddCha
  • 465
  • 2
  • 8
  • 15