Как написать PODO из JSON, который имеет 2 списка объектов с тем же именем, но разными значениями во флаттере?
Я пытаюсь получить объект JSON, который имеет 2 объекта списка с тем же именем, но имеет другое значение. Список объектов с именем "items", первый "items" имеет "products_title,product_image,link", а второй "items" имеет "article_title, article_image,link". Как написать ПОДО?
Я пытался написать PODO, но даже я пытаюсь изменить модель, она все еще не работает. Я пробую другой REST API, для примера " https://jsonplaceholder.typicode.com/pothos" он работает нормально. Но если я попытаюсь использовать мой JSON, получая ошибку, мне интересно, как написать PODO?
это JSON, который я использую:
{
"data": [
{
"section": "electronics",
"items": [
{
"product_name": "Cellphone",
"product_image": "cellphoneImage.png",
"link": "https://cellphone.html"
},
]
},
{
"section": "facts",
"section_title": "Title section",
"items": [
{
"article_title": "Facts",
"article_image": "https://www.facts.png",
"link": "https://www.facts.html"
},
]
}
]
}
1 ответ
Первый способ
использование fat
PODO (если это возможно для ваших изменений данных).
import 'dart:convert';
import 'json_objects.dart';
void main() {
var json = jsonDecode(_source) as Map<String, dynamic>;
var response = Response1.fromJson(json);
for (var element in response.data) {
print(element.section);
for (var item in element.items) {
switch (getIteKind(item)) {
case ItemKind.article:
print(' ' + item.articleTitle);
break;
case ItemKind.product:
print(' ' + item.productImage);
break;
default:
throw StateError('Something went wrong');
}
}
}
}
ItemKind getIteKind(Item item) {
if (item.articleTitle != null) {
return ItemKind.article;
} else if (item.productImage != null) {
return ItemKind.product;
}
return null;
}
enum ItemKind { article, product }
final _source = '''
{
"data": [
{
"section": "electronics",
"items": [
{
"product_name": "Cellphone",
"product_image": "cellphoneImage.png",
"link": "https://cellphone.html"
}
]
},
{
"section": "facts",
"section_title": "Title section",
"items": [
{
"article_title": "Facts",
"article_image": "https://www.facts.png",
"link": "https://www.facts.html"
}
]
}
]
}''';
Результат:
электроника cellphoneImage.png факты факты
Используемые модели данных JSON (сгенерированные инструментом)
class Data {
final List<Item> items;
final String section;
Data({this.items, this.section});
factory Data.fromJson(Map<String, dynamic> json) {
return Data(
items: _toObjectList(json['items'], (e) => Item.fromJson(e)),
section: json['section'] as String,
);
}
Map<String, dynamic> toJson() {
return {
'items': _fromList(items, (e) => e.toJson()),
'section': section,
};
}
}
class Item {
final String articleTitle;
final String link;
final String productImage;
final String productName;
Item({this.articleTitle, this.link, this.productImage, this.productName});
factory Item.fromJson(Map<String, dynamic> json) {
return Item(
articleTitle: json['article_title'] as String,
link: json['link'] as String,
productImage: json['product_image'] as String,
productName: json['product_name'] as String,
);
}
Map<String, dynamic> toJson() {
return {
'article_title': articleTitle,
'link': link,
'product_image': productImage,
'product_name': productName,
};
}
}
class Response1 {
final List<Data> data;
Response1({this.data});
factory Response1.fromJson(Map<String, dynamic> json) {
return Response1(
data: _toObjectList(json['data'], (e) => Data.fromJson(e)),
);
}
Map<String, dynamic> toJson() {
return {
'data': _fromList(data, (e) => e.toJson()),
};
}
}
List _fromList(data, 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;
}
List<T> _toObjectList<T>(data, T Function(Map<String, dynamic>) fromJson) {
if (data == null) {
return null;
}
var result = <T>[];
for (var element in data) {
T value;
if (element != null) {
value = fromJson(element as Map<String, dynamic>);
}
result.add(value);
}
return result;
}
/*
Response1:
"data": List<Data>
Data:
"section": String
"items": List<Item>
Item:
"article_title": String
"product_name": String
"product_image": String
"link": String
*/
Второй способ
Объявите изменения данных как хеш-карты.
import 'dart:convert';
import 'json_objects.dart';
void main() {
var json = jsonDecode(_source) as Map<String, dynamic>;
var response = Response1.fromJson(json);
for (var element in response.data) {
print(element.section);
var items = element.items;
for (var item in items) {
for (var key in item.keys) {
var value = item[key];
print(' $key: $value');
}
}
}
}
enum ItemKind { article, product }
final _source = '''
{
"data": [
{
"section": "electronics",
"items": [
{
"product_name": "Cellphone",
"product_image": "cellphoneImage.png",
"link": "https://cellphone.html"
}
]
},
{
"section": "facts",
"section_title": "Title section",
"items": [
{
"article_title": "Facts",
"article_image": "https://www.facts.png",
"link": "https://www.facts.html"
}
]
}
]
}''';
электроника product_name: мобильный телефон product_image: cellphoneImage.png ссылка: https: //cellphone.html факты article_title: факты article_image: https://www.facts.png ссылка: https: //www.facts.html
Другие модели данных JSON.
class Data {
final List<Map<String, Object>> items;
final String section;
Data({this.items, this.section});
factory Data.fromJson(Map<String, dynamic> json) {
return Data(
items: _toList(json['items'], (e) => _toMap(e, (e) => e)),
section: json['section'] as String,
);
}
Map<String, dynamic> toJson() {
return {
'items': _fromList(items, (e) => _fromMap(e, (e) => e)),
'section': section,
};
}
}
class Response1 {
final List<Data> data;
Response1({this.data});
factory Response1.fromJson(Map<String, dynamic> json) {
return Response1(
data: _toObjectList(json['data'], (e) => Data.fromJson(e)),
);
}
Map<String, dynamic> toJson() {
return {
'data': _fromList(data, (e) => e.toJson()),
};
}
}
List _fromList(data, 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;
}
Map<K, V> _fromMap<K, V>(data, V Function(dynamic) toJson) {
if (data == null) {
return null;
}
var result = <K, V>{};
for (var key in data.keys) {
V value;
var element = data[key];
if (element != null) {
value = toJson(element);
}
result[key as K] = value;
}
return result;
}
List<T> _toList<T>(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;
}
Map<K, V> _toMap<K, V>(data, V Function(dynamic) fromJson) {
if (data == null) {
return null;
}
var result = <K, V>{};
for (var key in data.keys) {
V value;
var element = data[key];
if (element != null) {
value = fromJson(element);
}
result[key as K] = value;
}
return result;
}
List<T> _toObjectList<T>(data, T Function(Map<String, dynamic>) fromJson) {
if (data == null) {
return null;
}
var result = <T>[];
for (var element in data) {
T value;
if (element != null) {
value = fromJson(element as Map<String, dynamic>);
}
result.add(value);
}
return result;
}
/*
Response1:
"data": List<Data>
Data:
"section": String
"items": List<Map<String, Object>>
*/