Json.Encode() не распознает объекты, устанавливает их как строку FLUTTER

avatar
Juan Camacho
9 августа 2021 в 05:08
103
1
0

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

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)

avatar
Sajad Abdollahi
9 августа 2021 в 06:09
0

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

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 (строки) в то, что было до кодирования