Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtSpApJsn 173 of 224 menu
◀ ▶

Разбор JSON-тела в Dart

Тело ответа API - это всегда текст. Перед разбором его удобно сохранить в переменную, даже если строка уже задана в программе. fromJson читает ключи по именам полей класса, в том числе когда значение само является объектом.

Для блока user объявляют отдельный тип, а корневой тип ссылается на него полем. У обоих классов есть фабрика fromJson:

class Person { Person(this.name, this.surn); final String name; final String surn; factory Person.fromJson(Map<String, Object?> json) { return Person( json['name'] as String, json['surn'] as String, ); } } class ProfileDoc { ProfileDoc(this.user, this.city); final Person user; final String city; factory ProfileDoc.fromJson(Map<String, Object?> json) { return ProfileDoc( Person.fromJson( json['user'] as Map<String, Object?>, ), json['city'] as String, ); } }

Готовый фрагмент JSON можно разобрать сразу в ProfileDoc и обратиться к вложенным полям через точку:

import 'dart:convert'; class Person { Person(this.name, this.surn); final String name; final String surn; factory Person.fromJson(Map<String, Object?> json) { return Person( json['name'] as String, json['surn'] as String, ); } } class ProfileDoc { ProfileDoc(this.user, this.city); final Person user; final String city; factory ProfileDoc.fromJson(Map<String, Object?> json) { return ProfileDoc( Person.fromJson( json['user'] as Map<String, Object?>, ), json['city'] as String, ); } } void main() { var rawText = ''' { "user": { "name": "john", "surn": "smit" }, "city": "London" } '''; var raw = jsonDecode(rawText); if (raw is Map<String, Object?>) { var doc = ProfileDoc.fromJson(raw); print(doc.user.name); print(doc.city); } }

Если в корне лежит массив строк, после jsonDecode сверяют тип с List<Object?> и приводят элементы к String. Порядок в Dart совпадает с порядком в JSON:

import 'dart:convert'; void main() { var rawText = '["alpha","beta","gamma"]'; var raw = jsonDecode(rawText); if (raw is List<Object?>) { var tags = raw.map((e) => e as String).toList(); print(tags.join(',')); } }

Дан следующий код:

var rawText = ''' { "user": { "name": "john", "surn": "smit" }, "city": "London" } ''';

Опишите классы с fromJson для user и корня. Выведите имя и город на отдельных строках.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить