#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 = [];
}