Необработанное исключение: тип ‘List’ не является подтипом типа ‘SubJsonModel’ — flutter

#json #flutter #dart

#json #флаттер #dart

Вопрос:

Пытаюсь получить данные из URL-адреса json, но получаю сообщение об ошибке

Необработанное исключение: тип ‘List’ не является подтипом типа ‘SubJsonModel’

main.dart

 final String url = 'https://raw.githubusercontent.com/BrightCode1/ohms-json/master/categories.json';
List<JsonModel> myModel = [];

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    loadData();
  }

  loadData() async {
  var res = await http.get(url, headers: {"Accept":"application/json"});
  if(res.statusCode == 200) {
    String resBody = res.body;
    var jsonDecode = json.decode(resBody);
    for(var data in jsonDecode) {
      myModel.add(JsonModel(data['cat_id'], data['category'], data['cat_subcategory']));
      setState(() {});
    }
      print(myModel[1].subCat.name);
  }else {
    print("Something went wrong!");
  }
  }
 

model.dart

 class JsonModel {
  final String id;
  final String category;
  SubJsonModel subCat;

  JsonModel(this.id, this.category, this.subCat);
}

class SubJsonModel {
  final String name;
  final String image;

  SubJsonModel(this.name, this.image);
}
 

пожалуйста, как мне решить эту проблему

Комментарии:

1. Добавьте образец тела ответа на вызов конечной точки HTTP к вопросу.

Ответ №1:

Итак, вот что я делаю: сначала создаю класс модели с помощью этого онлайн-инструмента. А затем изменил код, например, сначала сохранить подкатегорию в одном списке, а затем передать ее в основной список, а затем распечатать

Вот мой loadData() метод

последняя строка url = ‘https://raw.githubusercontent.com/BrightCode1/ohms-json/master/categories.json ‘; Список MyModel = [];

   loadData() async {
    var res = await http.get(url, headers: {"Accept": "application/json"});
    if (res.statusCode == 200) {
      String resBody = res.body;
      var jsonDecode = json.decode(resBody);
      for (var data in jsonDecode) {


        List<CatSubcategory> subCate = [];   // Set a emoty list of CatSubcategory
         data['cat_subcategory'].map((x) {  // Here parsed the cat_subcategory data and simply add it into list
          return subCate.add(
              CatSubcategory(subName: x['sub_name'], subImage: x['sub_image']));
        }).toList();  // and this done for we get map data so convert this data toList();


        myModel.add(JsonModel(
            category: data['category'],
            catId: data['cat_id'],
            catIcon: data['cat_icon'],
            catSubcategory: subCate));
        setState(() {});
      }
      print(myModel[0].catSubcategory[0].subName);
    } else {
      print("Something went wrong!");
    }
  }
 

вот мой model class

 class JsonModel {
  JsonModel({
    this.category,
    this.catId,
    this.catIcon,
    this.catSubcategory,
  });

  String category;
  String catId;
  String catIcon;
  List<CatSubcategory> catSubcategory;

  factory JsonModel.fromJson(Map<String, dynamic> json) => JsonModel(
        category: json["category"],
        catId: json["cat_id"],
        catIcon: json["cat_icon"],
        catSubcategory: List<CatSubcategory>.from(
            json["cat_subcategory"].map((x) => CatSubcategory.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "category": category,
        "cat_id": catId,
        "cat_icon": catIcon,
        "cat_subcategory":
            List<dynamic>.from(catSubcategory.map((x) => x.toJson())),
      };
}

class CatSubcategory {
  CatSubcategory({
    this.subName,
    this.subImage,
  });

  String subName;
  String subImage;

  factory CatSubcategory.fromJson(Map<String, dynamic> json) => CatSubcategory(
        subName: json["sub_name"],
        subImage: json["sub_image"],
      );

  Map<String, dynamic> toJson() => {
        "sub_name": subName,
        "sub_image": subImage,
      };
}
 

Ответ №2:

Вы можете использовать https://app.quicktype.io / для создания модели.dart из json.

Чтобы проанализировать эти данные JSON, выполните final pieSingleChartInfo = pieSingleChartInfoFromJson(jsonString);

 import 'dart:convert';

List<PieSingleChartInfo> pieSingleChartInfoFromJson(String str) => List<PieSingleChartInfo>.from(json.decode(str).map((x) => PieSingleChartInfo.fromJson(x)));

String pieSingleChartInfoToJson(List<PieSingleChartInfo> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class PieSingleChartInfo {
    PieSingleChartInfo({
        this.category,
        this.catId,
        this.catIcon,
        this.catSubcategory,
    });

    String category;
    String catId;
    String catIcon;
    List<CatSubcategory> catSubcategory;

    factory PieSingleChartInfo.fromJson(Map<String, dynamic> json) => PieSingleChartInfo(
        category: json["category"],
        catId: json["cat_id"],
        catIcon: json["cat_icon"] == null ? null : json["cat_icon"],
        catSubcategory: List<CatSubcategory>.from(json["cat_subcategory"].map((x) => CatSubcategory.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "category": category,
        "cat_id": catId,
        "cat_icon": catIcon == null ? null : catIcon,
        "cat_subcategory": List<dynamic>.from(catSubcategory.map((x) => x.toJson())),
    };
}

class CatSubcategory {
    CatSubcategory({
        this.subName,
        this.subImage,
    });

    String subName;
    String subImage;

    factory CatSubcategory.fromJson(Map<String, dynamic> json) => CatSubcategory(
        subName: json["sub_name"],
        subImage: json["sub_image"],
    );

    Map<String, dynamic> toJson() => {
        "sub_name": subName,
        "sub_image": subImage,
    };
}
 

Комментарии:

1. Конечно, вы можете проверить мой ответ выше

Ответ №3:

Я отметил несколько проблем и исправил их на основе предоставленной вами информации. Прочитайте комментарии. Добавьте образец тела ответа на вопрос.

 final String url =
    'https://raw.githubusercontent.com/BrightCode1/ohms-json/master/categories.json';
List<JsonModel> myModel = [];

@override
void initState() {
  // TODO: implement initState
  super.initState();
  loadData();
}

loadData() async {
  var res = await http.get(url, headers: {"Accept": "application/json"});
  if (res.statusCode == 200) {
    String resBody = res.body;
    var jsonDecode = json.decode(resBody);
    for (var data in jsonDecode) {
      // first create SubJsonModel object
      var subCat = SubJsonModel(
          data['cat_subcategory']['name'], data['cat_subcategory']['image']);
      //use subCat to create JsonModel
      myModel.add(JsonModel(data['cat_id'], data['category'], subCat));
      setState(() {});
    }
    print(myModel[1].subCat.name);
  } else {
    print("Something went wrong!");
  }
}