Преобразование строки в Json с вложенным списком массивов

#dart #flutter

#dart #флаттер

Вопрос:

Я хочу преобразовать строку в объект класса. Пример строки выглядит следующим образом :

 [{
    "MESSAGE": "Successfully!",
    "ORIGINAL_ERROR": "",
    "ERROR_STATUS": false,
    "RECORDS": true,
    "Data": [{
        "Id": "1",
        "Name": "Third AC"
    }, {
        "Id": "2",
        "Name": "Second AC"
    }, {
        "Id": "3",
        "Name": "First AC"
    }, {
        "Id": "4",
        "Name": "AC Chair Car"
    }, {
        "Id": "5",
        "Name": "First Class"
    }, {
        "Id": "6",
        "Name": "Sleeper Class"
    }, {
        "Id": "7",
        "Name": "Second Class Unreserved"
    }, {
        "Id": "8",
        "Name": "3AC Economy "
    }, {
        "Id": "9",
        "Name": "Second Seating"
    }, {
        "Id": "10",
        "Name": "Executive Class"
    }]
}]
 

И я хочу преобразовать строку в объект класса. Класс

 class TrainClassData {
  String MESSAGE;
  String ORIGINAL_ERROR;
  String ERROR_STATUS;
  String RECORDS;
  List<TrainClass> Data;

  TrainClassData({
    this.MESSAGE,
    this.ORIGINAL_ERROR,
    this.ERROR_STATUS,
    this.RECORDS,
    this.Data,
  });

  factory TrainClassData.fromJson(Map<String, dynamic> json) {
    return TrainClassData(
      MESSAGE: json['Id'] as String,
      ORIGINAL_ERROR: json['Name'] as String,
      ERROR_STATUS: json['Name'] as String,
      RECORDS: json['Name'] as String,
      Data: json['Data'].map<TrainClass>((json) => TrainClass.fromJson(json)).toList()
    );
  }
}

class TrainClass {
  String Id;
  String Name;

  TrainClass({
    this.Id,
    this.Name,
  });

  factory TrainClass.fromJson(Map<String, dynamic> json) {
    return TrainClass(
        Id: json['Id'] as String, Name: json['Name'] as String);
  }
}
 

Я использую сервис, но когда я пытаюсь использовать этот класс для получения данных, он выдает ошибку. Мой вызов службы выглядит следующим образом.

 static Future<List<TrainClassData>> GetTrainClass() async {
    String url = 'http://ttreturn.itfuturz.com/AppService.asmx/TrainClassMaster?type=trainclass';
    print("train class URL: "   url);
    final response = await http.get(url);
    try {
      if (response.statusCode == 200) {
        List<TrainClassData> list = [];
        if (response.body != "" amp;amp; response.body.toString() != "[]") {
          final parsed = json.decode(response.body).cast<Map<String, dynamic>>();
          var trainClassData = parsed.map<TrainClassData>((json) => TrainClassData.fromJson(json));
          if(trainClassData.ERROR_STATUS == false) {
            list = trainClassData.Data;
          }
          else {
            list = [];
          }
        }
        return list;
      } else {
        throw Exception(MESSAGES.INTERNET_ERROR);
      }
    } catch (e) {
      print("Kapil Erorr : "   e.toString());
      throw Exception(MESSAGES.INTERNET_ERROR);
    }
  }
 

Я получаю сообщение об ошибке.

Ошибка NoSuchMethodError: класс ‘MappedListIterable, TrainClassData>’ не имеет средства получения экземпляра ‘ERROR_STATUS’.

Пожалуйста, помогите мне. Заранее спасибо.

Комментарии:

1. Я рекомендую вам это javiercbk.github.io/json_to_dart чтобы преобразовать json в класс dart. Затем прочитайте этот flutter.dev/docs/development/data-and-backend/… для генерации кода. Не делайте все это вручную.

Ответ №1:

Были некоторые личные ошибки, которые вызывают проблемы.

1) Пакет преобразования Dart заботится о приведении данных. Поэтому вы должны использовать правильный тип для свойств. (например, ERROR_STATUS должен быть bool, а не string ).

2) Ответ представляет собой массив. вы должны проверить типы и классы, которые вы используете. исправленный пример здесь:

 class TrainClassData {
  String MESSAGE;
  String ORIGINAL_ERROR;
  bool ERROR_STATUS;

  bool RECORDS;
  List<TrainClass> Data;

  TrainClassData({
    this.MESSAGE,
    this.ORIGINAL_ERROR,
    this.ERROR_STATUS,
    this.RECORDS,
    this.Data,
  });

  factory TrainClassData.fromJson(Map<String, dynamic> json) {
    return TrainClassData(
        MESSAGE: json['MESSAGE'] as String,
        ORIGINAL_ERROR: json['ORIGINAL_ERROR'] as String,
        ERROR_STATUS: json['ERROR_STATUS'] as bool,
        RECORDS: json['RECORDS'] as bool,
        Data: json['Data']
            .map<TrainClass>((json) => TrainClass.fromJson(json))
            .toList());
  }
}

class TrainClass {
  String Id;
  String Name;

  TrainClass({
    this.Id,
    this.Name,
  });

  factory TrainClass.fromJson(Map<String, dynamic> json) {
    return TrainClass(Id: json['Id'] as String, Name: json['Name'] as String);
  }
}
 

И для службы:

 List<TrainClass> list = [];
    final parsed = json.decode(response.body).cast<Map<String, dynamic>>();
    var trainClassData = parsed
        .map<TrainClassData>((json) => TrainClassData.fromJson(json))
        .toList();
    if (trainClassData[0].ERROR_STATUS == false) {
      list = trainClassData[0].Data;
    } else {
      list = [];
    }