Преобразовать список в строку Json, затем преобразовать эту строку обратно в список в Dart

Я хочу преобразовать список List<Word> myListв String и поместить его в sharedPreference, а позже я также хочу преобразовать эту строку (из sharedPreference) обратно в List<Word>.

Вот мой модельный класс Word

class Word {
  int id;
  String word;
  String meaning;
  String fillInTheGapSentence;

  Word.empty();

  Word(int id, String word, String meaning, String fillInTheGapSentence){
    this.id = id;
    this.word = word;
    this.meaning = meaning;
    this.fillInTheGapSentence = fillInTheGapSentence;
  }
}

Я могу преобразовать List<Word> myList в строку следующим образом

var myListString = myList.toString();

Но не смог сделать List<Word> myListFromString из myListString.

Спасибо.


person Al Walid Ashik    schedule 02.12.2019    source источник


Ответы (2)


Вам понадобится какая-то сериализация, и их много. Одним из самых популярных является сериализация JSON.

У Flutter есть довольно хорошая документация, как это сделать: https://flutter.dev/docs/development/data-and-backend/json

Вы хотите:

  1. Превратите свой объект в карту
  2. Закодируйте свою карту в JSON (это строка)
  3. Сохрани это
  4. Получить его как строку
  5. Расшифруйте свой JSON как карту
  6. Превратите свою карту в объект
person pr0gramist    schedule 02.12.2019

Прежде всего, myList.toString() не в формате JSON, если только вы не переопределите метод toString(). Что вам нужно сделать, так это вручную преобразовать объект в словарь, а затем закодировать его в строку JSON. И наоборот, вам нужно преобразовать строку в словарь, а затем преобразовать ее в объект. Что-то вроде этого:

import 'dart:convert';

class Word {
  int id;
  String word;
  String meaning;
  String fillInTheGapSentence;

  Word.empty();

  Word(int id, String word, String meaning, String fillInTheGapSentence) {
    this.id = id;
    this.word = word;
    this.meaning = meaning;
    this.fillInTheGapSentence = fillInTheGapSentence;
  }

  Map<String, dynamic> toMap() {
    return {
      'id': this.id,
      'word': this.word,
      'meaning': this.meaning,
      'fillInTheGapSentence': this.fillInTheGapSentence,
    };
  }

  factory Word.fromMap(Map<String, dynamic> map) {
    return new Word(
      map['id'] as int,
      map['word'] as String,
      map['meaning'] as String,
      map['fillInTheGapSentence'] as String,
    );
  }
}

String convertToJson(List<Word> words) {
  List<Map<String, dynamic>> jsonData =
      words.map((word) => word.toMap()).toList();
  return jsonEncode(jsonData);
}

List<Word> fromJSon(String json) {
  List<Map<String, dynamic>> jsonData = jsonDecode(json);
  return jsonData.map((map) => Word.fromMap(map)).toList();
}

person danypata    schedule 02.12.2019