Я изучаю Flutter.io и, как обычно, учусь на примерах, доступных в Интернете. На момент написания примеры JSON, которые используют только пакет «dart: convert», как правило, демонстрируют простой JSON, а сложные примеры JSON, как правило, используют генераторы, которые могут подходить или не подходить для всех случаев использования.

Так что для других новичков этот пример для вас. На данный момент я обрабатываю вложенный JSON с помощью «dart: convert».

Вот JSON, который представляет собой упрощенную версию реальной вещи для иллюстрации.

const paymentsJson = """
{
  "result": "success",
  "count": 2,
  "payments": [
    {
      "amount": "100.0",
      "destination": "rf1BiGeXwwQoi8",
      "executed_time": "2014-05-29T17:05:20Z",
      "source": "ra5nK24KXen9AH"
    },
    {
      "amount": "1.0",
      "destination": "ra5nK24KXen9AH",
      "executed_time": "2014-06-02T22:47:50Z",
      "source": "rf1BiGeXwwQoi8"
    }
  ]
}
""";

Для каждого объекта в JSON мы определим соответствующий класс. Начнем с дочернего объекта.

class Payment {
  double amount;
  String source, destination;
  DateTime executedTime;

  Payment.fromJson(Map<String, dynamic> jsonMap) {
    this.amount = double.parse(jsonMap['amount']);
    this.source = jsonMap['source'];
    this.destination = jsonMap['destination'];
    this.executedTime = DateTime.parse(jsonMap['executed_time']);
  }
}

И затем родительский объект, который содержит дочерние элементы и дополнительные данные.

class Payments {
  String result;
  int count;
  List<Payment> payments;

  Payments.fromJson(String jsonStr) {
    final _map = jsonDecode(jsonStr);
    this.result = _map['result'];
    this.count = _map['count'];
    this.payments = [];
    final _paymentList = _map['payments'];

    for (var i = 0; i < (this.count); i++) {
      this.payments.add(new Payment.fromJson(_paymentList[i]));
    }
  }
}

И кстати:

  1. Объявление поля в классе не обязательно должно точно соответствовать JSON; например поле JSON «выполнено_время» представлено в классе как «исполняемое время».
  2. Не все поля в JSON должны быть представлены в вашем классе; вы можете пропустить поле / объект в объявлении вашего класса, если оно вам не нужно.
  3. Вы можете вложить больше / больше уровня, если вам нужно.

Вот полный тестовый код. Надеюсь, этот небольшой пример окажется полезным.

import 'dart:convert' show jsonDecode;
import 'package:test/test.dart';

const paymentsJson = """
{
  "result": "success",
  "count": 2,
  "payments": [
    {
      "amount": "100.0",
      "destination": "rf1BiGeXwwQoi8",
      "executed_time": "2014-05-29T17:05:20Z",
      "source": "ra5nK24KXen9AH"
    },
    {
      "amount": "1.0",
      "destination": "ra5nK24KXen9AH",
      "executed_time": "2014-06-02T22:47:50Z",
      "source": "rf1BiGeXwwQoi8"
    }
  ]
}
""";

void main() {
  test('test json conversion', () {
    final pmt = new Payments.fromJson(paymentsJson);
    //expect(pmt.result, "success");
    expect(pmt.count, 2);
    expect(pmt.payments[0].amount, 100.0);
    expect(pmt.payments[1].amount, 1.0);
    expect(pmt.payments[1].source, "rf1BiGeXwwQoi8");
    expect(pmt.payments[1].destination, "ra5nK24KXen9AH");
    expect(pmt.payments[1].executedTime, DateTime.utc(2014, 6, 2, 22, 47, 50));
  });
}

class Payments {
  //String result;
  int count;
  List<Payment> payments;

  Payments.fromJson(String jsonStr) {
    final _map = jsonDecode(jsonStr);
    //this.result = _map['result'];
    this.count = _map['count'];
    this.payments = [];
    final _paymentList = _map['payments'];

    for (var i = 0; i < (this.count); i++) {
      this.payments.add(new Payment.fromJson(_paymentList[i]));
    }
  }
}

class Payment {
  double amount;
  String source, destination;
  DateTime executedTime;

  Payment.fromJson(Map<String, dynamic> jsonMap) {
    this.amount = double.parse(jsonMap['amount']);
    this.source = jsonMap['source'];
    this.destination = jsonMap['destination'];
    this.executedTime = DateTime.parse(jsonMap['executed_time']);
  }
}

Удачного кодирования.