Разбор 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 и корня. Выведите имя и город
на отдельных строках.