Я изучаю 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])); } } }
И кстати:
- Объявление поля в классе не обязательно должно точно соответствовать JSON; например поле JSON «выполнено_время» представлено в классе как «исполняемое время».
- Не все поля в JSON должны быть представлены в вашем классе; вы можете пропустить поле / объект в объявлении вашего класса, если оно вам не нужно.
- Вы можете вложить больше / больше уровня, если вам нужно.
Вот полный тестовый код. Надеюсь, этот небольшой пример окажется полезным.
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']); } }
Удачного кодирования.