JSON (нотация объектов JavaScript) – это популярный формат обмена данными, используемый во многих мобильных и веб-приложениях. Во Flutter цикл по данным JSON — обычная задача при работе с API или локальными файлами данных. В этой статье мы рассмотрим семь различных методов обработки JSON во Flutter, а также примеры кода для каждого метода.
Метод 1: использование функции json.decode()
Dart предоставляет пакет json
, который включает функцию json.decode()
для анализа строк JSON. Вот пример того, как перебрать JSON с помощью этого метода:
import 'dart:convert';
void loopThroughJSON(String jsonString) {
dynamic jsonData = json.decode(jsonString);
for (var item in jsonData) {
// Access individual items in the JSON object
var itemName = item['name'];
var itemValue = item['value'];
// Do something with the item
}
}
Метод 2: использование функции jsonDecode()
(Flutter 2.x и Dart 2.15+)
Начиная с Flutter 2.x и Dart 2.15, вы можете использовать jsonDecode()
напрямую из библиотеки dart:convert
. Вот пример:
import 'dart:convert';
void loopThroughJSON(String jsonString) {
dynamic jsonData = jsonDecode(jsonString);
for (var item in jsonData) {
// Access individual items in the JSON object
var itemName = item['name'];
var itemValue = item['value'];
// Do something with the item
}
}
Метод 3: использование пакета json_serializable
Пакет json_serializable
упрощает сериализацию и десериализацию JSON в Dart. Во-первых, вам нужно определить класс модели и аннотировать его @JsonSerializable
. Вот пример:
import 'package:json_annotation/json_annotation.dart';
part 'my_model.g.dart';
@JsonSerializable()
class MyModel {
String name;
String value;
MyModel(this.name, this.value);
factory MyModel.fromJson(Map<String, dynamic> json) =>
_$MyModelFromJson(json);
Map<String, dynamic> toJson() => _$MyModelToJson(this);
}
void loopThroughJSON(String jsonString) {
List<MyModel> items = (json.decode(jsonString) as List)
.map((itemJson) => MyModel.fromJson(itemJson))
.toList();
for (var item in items) {
// Access individual items in the JSON object
var itemName = item.name;
var itemValue = item.value;
// Do something with the item
}
}
Метод 4: использование пакета json_annotation
(без генерации кода)
Если вы не хотите использовать генерацию кода, вы можете вручную реализовать анализ JSON с помощью json_annotation
пакет. Вот пример:
import 'package:json_annotation/json_annotation.dart';
@JsonSerializable()
class MyModel {
String name;
String value;
MyModel(this.name, this.value);
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(
json['name'] as String,
json['value'] as String,
);
}
Map<String, dynamic> toJson() => {
'name': name,
'value': value,
};
}
void loopThroughJSON(String jsonString) {
dynamic jsonData = json.decode(jsonString);
for (var item in jsonData) {
MyModel myModel = MyModel.fromJson(item);
// Access individual items in the JSON object
var itemName = myModel.name;
var itemValue = myModel.value;
// Do something with the item
}
}
Метод 5: использование пакета json_serializable
с вложенными объектами
Пакет json_serializable
поддерживает анализ JSON с вложенными объектами. Вот пример:
import 'package:json_annotation/json_annotation.dart';
part 'my_model.g.dart';
@JsonSerializable()
class MyModel {
String name;
String value;
NestedModel nestedModel;
MyModel(this.name, this.value, this.nestedModel);
factory MyModel.fromJson(Map<String, dynamic> json) =>
_$MyModelFromJson(json);
Map<String, dynamic> toJson() => _$MyModelToJson(this);
}
@JsonSerializable()
class NestedModel {
// Nested model definition
NestedModel();
factory NestedModel.fromJson(Map<String, dynamic> json) =>
_$NestedModelFromJson(json);
Map<String, dynamic> toJson() => _$NestedModelToJson(this);
}
void loopThroughJSON(String jsonString) {
List<MyModel> items = (json.decode(jsonString) as List)
.map((itemJson) => MyModel.fromJson(itemJson))
.toList();
for (var item in items) {
// Access individual items and nested objects in the JSON object
var itemName = item.name;
var itemValue = item.value;
var nestedObjectName = item.nestedModel.name;
var nestedObjectValue = item.nestedModel.value;
// Do something with the item
}
}
Метод 6: использование пакета json_annotation
с вложенными объектами (без генерации кода)
Если вы предпочитаете не использовать генерацию кода, вы можете вручную проанализировать JSON с вложенными объектами с помощью 21 пакет. Вот пример:
import 'package:json_annotation/json_annotation.dart';
@JsonSerializable()
class MyModel {
String name;
String value;
NestedModel nestedModel;
MyModel(this.name, this.value, this.nestedModel);
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(
json['name'] as String,
json['value'] as String,
NestedModel.fromJson(json['nestedModel'] as Map<String, dynamic>),
);
}
Map<String, dynamic> toJson() => {
'name': name,
'value': value,
'nestedModel': nestedModel.toJson(),
};
}
@JsonSerializable()
class NestedModel {
// Nested model definition
NestedModel();
factory NestedModel.fromJson(Map<String, dynamic> json) {
// Parse the nested object properties here
return NestedModel();
}
Map<String, dynamic> toJson() => {
// Convert the nested object properties to JSON here
};
}
void loopThroughJSON(String jsonString) {
dynamic jsonData = json.decode(jsonString);
for (var item in jsonData) {
MyModel myModel = MyModel.fromJson(item);
// Access individual items and nested objects in the JSON object
var itemName = myModel.name;
var itemValue = myModel.value;
var nestedObjectName = myModel.nestedModel.name;
var nestedObjectValue = myModel.nestedModel.value;
// Do something with the item
}
}
Метод 7: использование пакета json_serializable
с генерацией кода и моделями Flutter
Если вы предпочитаете создавать модели Flutter с генерацией кода, вы можете использовать пакет json_serializable
с аннотациями, специфичными для Flutter. Вот пример:
import 'package:json_annotation/json_annotation.dart';
part 'my_model.g.dart';
@JsonSerializable()
class MyModel {
@JsonKey(name: 'item_name')
String itemName;
@JsonKey(name: 'item_value')
String itemValue;
MyModel(this.itemName, this.itemValue);
factory MyModel.fromJson(Map<String, dynamic> json) =>
_$MyModelFromJson(json);
Map<String, dynamic> toJson() => _$MyModelToJson(this);
}
void loopThroughJSON(String jsonString) {
List<MyModel> items = (json.decode(jsonString) as List)
.map((itemJson) => MyModel.fromJson(itemJson))
.toList();
for (var item in items) {
// Access individual items in the JSON object using Flutter-specific names
var itemName = item.itemName;
var itemValue = item.itemValue;
// Do something with the item
}
}
В этой статье мы рассмотрели семь различных методов обработки JSON во Flutter. Каждый метод обеспечивает уникальный подход к анализу и обработке данных JSON в ваших приложениях Flutter. В зависимости от ваших требований и настроек проекта вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Освоив эти методы зацикливания JSON, вы будете хорошо подготовлены к обработке и манипулированию данными JSON в ваших проектах Flutter.
Не забудьте импортировать необходимые пакеты и библиотеки в зависимости от выбранного вами метода. Приятного кодирования!