7 методов перебора JSON во Flutter: подробное руководство

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.

Не забудьте импортировать необходимые пакеты и библиотеки в зависимости от выбранного вами метода. Приятного кодирования!