Kagimura
Kagimura

Reputation: 417

Creating Model for an Array of Objects inside a JSON in Flutter

I created a model that contains a List. This list is from a nested array of objects inside a JSON. Here is the 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"
      }
    ]
  }

Here is the model

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);
}

How do I set up the factory show it will render List terms;

Upvotes: 0

Views: 76

Answers (1)

Your question is incomprehensible, improve it please.

However according to your previous (deleted) questions, you need to be clear about the structure you work on.

The code below can be of help to you:

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) && 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 && 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 && !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) &&
            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!');
}

Result:

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!

Once you understand the structure, the rest is not complicated.

Upvotes: 1

Related Questions