Как десериализовать список объектов из json в flutter

Я использую пакет dart json_serializable для сериализации json. Глядя на документацию флаттера, он показывает, как десериализовать один объект следующим образом:

Future<Post> fetchPost() async {
  final response =
  await http.get('https://jsonplaceholder.typicode.com/posts/1');

  if (response.statusCode == 200) {
  // If the call to the server was successful, parse the JSON
  return Post.fromJson(json.decode(response.body));
  } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load post');
  }
}

Тем не менее, я недостаточно хорошо знаком с дротиками, чтобы выяснить, как сделать то же самое для списка элементов вместо одного экземпляра.

Ответ 1

Ну, ваш сервис будет обрабатывать либо тело ответа, являющееся картой, либо список карт соответственно. Исходя из имеющегося у вас кода, вы учитываете 1 товар.

Если тело ответа является итеративным, то вам нужно соответствующим образом проанализировать и пройтись, если я правильно понимаю ваш вопрос.

Пример:

Iterable l = json.decode(response.body);
List<Post> posts = l.map((Map model)=> Post.fromJson(model)).toList();

где сообщения - это список сообщений.

РЕДАКТИРОВАТЬ: я хотел бы добавить примечание ясности здесь. Цель здесь в том, чтобы вы расшифровали ответ. Следующий шаг - превратить эту итерируемую из объектов json в экземпляр вашего объекта. Это достигается созданием методов fromJson в вашем классе, чтобы правильно взять json и реализовать его соответствующим образом. Ниже приведен пример реализации.

class Post {
  // Other functions and properties relevant to the class
  // ......
  /// Json is a Map<dynamic,dynamic> if i recall correctly.
  static fromJson(json): Post {
    Post p = new Post()
    p.name = ...
    return p
  }
}

Я немного отвлечен от Дарт в эти дни в пользу лучшей утилиты для задач, которые необходимо выполнить. Так что мой синтаксис, скорее всего, немного отключен, но это псевдокод.

Ответ 2

Еще один пример в JSON Parsing для дальнейшего уточнения.

Пусть говорят, что мы хотим проанализировать массив элементов в нашем объекте JSON.

factory YoutubeResponse.fromJSON(Map<String, dynamic> YoutubeResponseJson) 
 {

// Below 2 line code is parsing JSON Array of items in our JSON Object (YouttubeResponse)


var list = YoutubeResponseJson['items'] as List;
List<Item> itemsList = list.map((i) => Item.fromJSON(i)).toList();

return new YoutubeResponse(
    kind: YoutubeResponseJson['kind'],
    etag: YoutubeResponseJson['etag'],
    nextPageToken: YoutubeResponseJson['nextPageToken'],
    regionCode: YoutubeResponseJson['regionCode'],
    mPageInfo: pageInfo.fromJSON(YoutubeResponseJson['pageInfo']),

    // Here we are returning parsed JSON Array.

    items: itemsList);

  }

Ответ 3

Сначала создайте класс, соответствующий вашим данным json, в моем случае я создаю (генерирую) класс с именем Img:

import 'dart:convert';

Img imgFromJson(String str) => Img.fromJson(json.decode(str));
String imgToJson(Img data) => json.encode(data.toJson());

class Img {
    String id;
    String img;
    dynamic decreption;

    Img({
        this.id,
        this.img,
        this.decreption,
    });

    factory Img.fromJson(Map<String, dynamic> json) => Img(
        id: json["id"],
        img: json["img"],
        decreption: json["decreption"],
    );

    Map<String, dynamic> toJson() => {
        "id": id,
        "img": img,
        "decreption": decreption,
    };
}

PS. Вы можете использовать app.quicktype.io для генерации вашего класса данных json в dart. затем отправьте сообщение/получите на свой сервер:

Future<List<Img>> _getimages() async {
    var response = await http.get("http://192.168.115.2/flutter/get_images.php");
    var rb = response.body;

    // store json data into list
    var list = json.decode(rb) as List;

    // iterate over the list and map each object in list to Img by calling Img.fromJson
    List<Img> imgs = list.map((i)=>Img.fromJson(i)).toList();

    print(imgs.runtimeType); //returns List<Img>
    print(imgs[0].runtimeType); //returns Img

    return imgs;
}

для получения дополнительной информации, это статья о синтаксическом анализе JSON в Flutter