Создание модели для массива объектов внутри JSON в Flutter

#json #flutter

#json #flutter

Вопрос:

Я создал модель, которая содержит список. Этот список взят из вложенного массива объектов внутри JSON. Вот JSON:

   {
    "id": {
      "bioguide": "B000944",
    },
    "name": {
      "first": "Larcy",
      "last": "Jamm",
    },
    "bio": {
      "birthday": "1952-11-09",
      "gender": "M"
    },
    "terms": [
      {

        "start": "2013-01-03",
        "end": "2019-01-03"
      },
      {
        "start": "2019-01-03",
        "end": "2025-01-03"
      }
    ]
  }
 

Вот модель

 import 'package:json_annotation/json_annotation.dart';

part 'legislator_model.g.dart';

@JsonSerializable()
class LegislatorModel {
  IdModel id;
  NameModel name;
  List<TermModel> terms;

  LegislatorModel({this.id, this.name, this.terms});

  factory LegislatorModel.fromJson(Map<String, dynamic> json) =>
      _$LegislatorModelFromJson(json);

  Map<String, dynamic> toJson() => _$LegislatorModelToJson(this);
}
 

Как мне настроить заводское отображение, чтобы оно отображало условия списка;

Ответ №1:

Ваш вопрос непонятен, улучшите его, пожалуйста.

Однако, согласно вашим предыдущим (удаленным) вопросам, вам необходимо четко представлять структуру, над которой вы работаете.

Приведенный ниже код может вам помочь:

json_structure_parser.dart

 class JsonStructureParser {
  static const indent = '  ';
  static const simpleTypes = [Null, int, double, DateTime, String];
  /* ---------------------------------------------------------------------------- */
  static String _getType(dynamic data) {
    var value = data.runtimeType.toString();

    void evalList(List list) {
      final data0 = list.where((e) => e != null);
      final type0 = data0.first.runtimeType;
      if (simpleTypes.contains(type0) amp;amp; data0.every((e) => e.runtimeType == type0)) {
        value = value.replaceFirst('dynamic', type0.toString());
      }
    }
    
    if (data is Map) {
      value = value.replaceAll('_InternalLinkedHashMap', 'Map');
      if (data.isNotEmpty) evalList(data.values.toList());
    }

    if (data is MapEntry) {
      if (simpleTypes.contains(data.value.runtimeType)) {
        value = value.replaceFirst('dynamic', data.value.runtimeType.toString());
      }
    }
    
    if (data is List amp;amp; data.isNotEmpty) evalList(data);

    return value;
  }
  /* ---------------------------------------------------------------------------- */
  static void analyze(dynamic data, {int level = 0, int depth = 1}) {
    var string = '${indent * level}${_getType(data)} ';

    if (data is Map || data is List) {
      string  = '${'.' * (60 - string.length)} (${data.length} items)';
    }
    
    print(string);

    if (string.contains('dynamic')) {
      if (data is List) {
        depth > 0
          ? data.take(depth).forEach((e) => analyze(e, level: level   1, depth: 0))
          : data.forEach((e) => analyze(e, level: level   1, depth: 0));
      } else {
        if (data is Map) {
          depth > 0
            ? data.entries.take(depth).forEach((e) => analyze(e, level: level   1, depth: 0))
            : data.entries.forEach((e) => analyze(e, level: level   1, depth: 0));
        } else {
          if (data is MapEntry amp;amp; !simpleTypes.contains(data.value.runtimeType)) {
            analyze(data.value, level: level   1, depth: 0);
          }
        }
      }
    }
  }
}
 

type_analyzer.dart

 import 'package:_samples2/congress_service.dart';
import 'package:_samples2/json_structure_parser.dart';


void main(List<String> args) async {
  print('Start fetching...');
  var legislators = await USCongress.fetchLegislators()
    .whenComplete(() => print('Fetching done!n'));
  
  print('Analyzing structure...n');
  JsonStructureParser.analyze(legislators);
  var termProperties = <String, List<Type>>{};
  (legislators as List).forEach((legislator) {
    (legislator['terms'] as List).forEach((term) {
      (term as Map).entries.forEach((property) {
        if (termProperties.containsKey(property.key)) {
          if (!termProperties[property.key].contains(property.value.runtimeType) amp;amp;
            property.value != null) {
            termProperties[property.key].add(property.value.runtimeType);
          }
        } else {
          termProperties[property.key] = [property.value.runtimeType];
        }
      });
    });
  });
  print('n${termProperties.length} properties found:');
  print(termProperties);
  print('nJob finished!');
}
 

Результат:

 Start fetching...
Fetching done!

Analyzing structure...

List<dynamic> .............................................. (538 items)
  Map<String, dynamic> ..................................... (4 items)
    MapEntry<String, dynamic> 
      Map<String, dynamic> ................................. (15 items)
        MapEntry<String, String> 
        MapEntry<String, String> 
        MapEntry<String, String> 
        MapEntry<String, int> 
        MapEntry<String, String> 
        MapEntry<String, int> 
        MapEntry<String, dynamic> 
          List<String> ..................................... (2 items)
        MapEntry<String, int> 
        MapEntry<String, String> 
        MapEntry<String, int> 
        MapEntry<String, String> 
        MapEntry<String, int> 
        MapEntry<String, int> 
        MapEntry<String, String> 
        MapEntry<String, String> 
    MapEntry<String, dynamic> 
      Map<String, String> .................................. (3 items)
    MapEntry<String, dynamic> 
      Map<String, String> .................................. (2 items)
    MapEntry<String, dynamic> 
      List<dynamic> ........................................ (10 items)
        Map<String, dynamic> ............................... (6 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (6 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (6 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (6 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (6 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (7 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (7 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (12 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (14 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
        Map<String, dynamic> ............................... (13 items)
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, int> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 
          MapEntry<String, String> 

19 properties found:
{type: [String], start: [String], end: [String], state: [String], district: [int], party: [String], url: [String], class: [int], address: [String], phone: [String], fax: [String], contact_form: [String], office: [String], state_rank: [String], rss_url: [String], how: [String], caucus: [String], party_affiliations: [List<dynamic>], end-type: [String]}

Job finished!
 

Как только вы поймете структуру, остальное не сложно.