Как вы сериализуете / анализируете вложенный массив JSON во Flutter / Dart, если у него нет имени / ключа - PullRequest
2 голосов
/ 03 мая 2019

Я работаю с RESTful API, который, кажется, работает и используется в других приложениях, которые дают мне что-то вроде этого:

 "notes": [
    [
      {
        "automaticNote": false,
        "contactId": 0,
        "caseFileId": 0,
        "dateCreated": "2019-05-02",
        "deletedTime": "2019-05-02T19:31:54.588Z"
      }
    ]
  ]

Двойная пара квадратных скобок означает, что одна пара квадратовскобки не имеют имени / ключа, связанного с ним.Что еще хуже, notes сам вложен в какой-то сложный JSON.

Я пытался использовать JSON для Dart , но выдает ошибку.Поэтому на самом деле мой вопрос, как мне сериализовать массив JSON без ключа / имени?

Обычно я делаю это так:

    class Note {
  bool automaticNote;
  int contactId;
  int caseFileId;
  String dateCreated;
  String deletedTime;

  Note(
      {this.automaticNote,
      this.contactId,
      this.caseFileId,
      this.dateCreated,
      this.deletedTime});

  Note.fromJson(Map<String, dynamic> json) {
    automaticNote = json['automaticNote'];
    contactId = json['contactId'];
    caseFileId = json['caseFileId'];
    dateCreated = json['dateCreated'];
    deletedTime = json['deletedTime'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['automaticNote'] = this.automaticNote;
    data['contactId'] = this.contactId;
    data['caseFileId'] = this.caseFileId;
    data['dateCreated'] = this.dateCreated;
    data['deletedTime'] = this.deletedTime;
    return data;
  }
}

Но двойной массив JSONотбрасывая меня (и опять же, notes сам вложен в более сложный объект JSON, но ради простоты я не включил все это здесь).

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Но двойной массив JSON отбрасывает меня ...

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

import 'dart:convert';

import 'json_objects.dart';

void main() {
  var map = jsonDecode(_json) as Map;
  var response1 = Response1.fromJson(map);
  for (var list1 in response1.notes) {
    for (var note in list1) {
      print(note.dateCreated);
      print(note.deletedTime);
    }
  }
}

var _json = '''
{
  "notes": [
    [
      {
        "automaticNote": false,
        "contactId": 0,
        "caseFileId": 0,
        "dateCreated": "2019-05-02",
        "deletedTime": "2019-05-02T19:31:54.588Z"
      }
    ]
  ]
}''';

Примеры объявлений моделей для вашего примера:

// Generated by 'yaml2podo'
// Version: 0.1.11
// https://pub.dev/packages/yaml2podo

class Response1 {
  final List<List<Response1Notes>> notes;

  Response1({this.notes});

  factory Response1.fromJson(Map map) {
    return Response1(
        notes: _toList(map['notes'],
            (e) => _toList(e, (e) => Response1Notes.fromJson(e as Map))));
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['notes'] = _fromList(notes, (e) => _fromList(e, (e) => e.toJson()));
    return result;
  }
}

class Response1Notes {
  final int contactId;
  final bool automaticNote;
  final int caseFileId;
  final DateTime deletedTime;
  final DateTime dateCreated;

  Response1Notes(
      {this.contactId,
      this.automaticNote,
      this.caseFileId,
      this.deletedTime,
      this.dateCreated});

  factory Response1Notes.fromJson(Map map) {
    return Response1Notes(
        contactId: map['contactId'] as int,
        automaticNote: map['automaticNote'] as bool,
        caseFileId: map['caseFileId'] as int,
        deletedTime: _toDateTime(map['deletedTime']),
        dateCreated: _toDateTime(map['dateCreated']));
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['contactId'] = contactId;
    result['automaticNote'] = automaticNote;
    result['caseFileId'] = caseFileId;
    result['deletedTime'] = _fromDateTime(deletedTime);
    result['dateCreated'] = _fromDateTime(dateCreated);
    return result;
  }
}

String _fromDateTime(dynamic data) {
  if (data == null) {
    return null;
  }
  if (data is DateTime) {
    return data.toIso8601String();
  }
  return data as String;
}

List _fromList(dynamic data, dynamic Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

DateTime _toDateTime(dynamic data) {
  if (data == null) {
    return null;
  }
  if (data is String) {
    return DateTime.parse(data);
  }
  return data as DateTime;
}

List<T> _toList<T>(dynamic data, T Function(dynamic) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element);
    }
    result.add(value);
  }
  return result;
}

/*
Response1:
  "notes": List<List<Response1Notes>>

Response1Notes:
  "automaticNote": bool
  "contactId": int
  "caseFileId": int
  "dateCreated": DateTime
  "deletedTime": DateTime
*/

1 голос
/ 03 мая 2019

После декодирования notes, как обычно, является членом некоторого Map<String, dynamic>. Давайте назовем это m.

Итак, m['notes'] - это список, кто первый участник, m['notes'][0] - это также список. Его первый член, m['notes'][0][0] - это еще один Map<String, dynamic>, который вам нужен для вашего конструктора.

Поэтому вы должны быть в состоянии использовать:

Note n = Note.fromJson(m['notes'][0][0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...