#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!
Как только вы поймете структуру, остальное не сложно.