Json.Функция Encode() Не распознает объекты, задает их как ТРЕПЕТАНИЕ строки

#flutter #dart #request

Вопрос:

Я пытаюсь отправить запрос и HTTP post на серверную часть моего приложения, проблема в том, что, когда я задаю тело запроса, оно задается в виде строки. В настоящее время я работаю с временным интервалом класса.

 class TimeSlot {
final String id;
final int year;
final int month;
final int day;
final int hour;

TimeSlot(
  {this.year = 0,
  this.day = 0,
  this.hour = 0,
  this.month = 0,
  required this.id});

Map toJson() => {'year': year, 'month': month, 'day': day, 'hour': hour};
}
 

и метод

 Future<Tutorship> sendNewTutorship(
  List<TimeSlot> timeSlots,
  String description,
  String tutorshipId,
  String courseId,
  String studentId) async {
var slots = jsonEncode(timeSlots);

var body = jsonEncode({
  'tutorshipId': tutorshipId,
  'studentId': studentId,
  'courseId': courseId,
  'availableSlots': slots,
  'description': description
});

print(body);

Map<String, String> headers = {
  'Content-type': 'application/json',
  'Accept': 'application/json',
};

final response = await http.post(
  Uri.parse(Strings.serviceUrl   '/tutorships'),
  headers: headers,
  body: body,
);

if (response.statusCode == 201) {
  return Tutorship.fromJson(jsonDecode(response.body));
} else {
  throw Exception('Could not create the tutorship');
} 
}
 

Метод печати показывает мне, как анализируется список временных интервалов, и это то, что я хочу:
[{«год»:2021,»месяц»:8,»день»:8,»час»:9}]

Но когда он задан в запросе тела, он изменяется на строку, подобную этой:

«[{«год»: 2021,»месяц»: 8,»день»: 11,»час»: 9}]»

Есть ли какой-нибудь способ избежать такого поведения?

Ответ №1:

Вы кодируете слоты дважды, и вы не преобразуете временные интервалы в список карт, поэтому измените

 var slots = jsonEncode(timeSlots);

var body = jsonEncode({
  'tutorshipId': tutorshipId,
  'studentId': studentId,
  'courseId': courseId,
  'availableSlots': slots,
  'description': description
});
 

к этому

(также предпочитайте ключевое слово final для определения неизменяемых переменных)

 final body = jsonEncode({
  'tutorshipId': tutorshipId,
  'studentId': studentId,
  'courseId': courseId,
  'availableSlots': timeSlots.map((x) => x.toMap()).toList(),
  'description': description
});
 

Объяснение о Jsons:

  • Кодировка Json означает преобразование карт или списков в строку, и мы называем эту строку Json
  • Декодирование Json означает преобразование Json(строки) в то, что было до его кодирования