Как написать 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>>
*/

Другие вопросы по тегам