未处理的异常:“List<dynamic>”类型不是“SubJsonModel”类型的子类型 - 颤动

时间:2021-01-27 15:21:19

标签: json flutter dart

我正在尝试从 json url 获取数据,但出现错误

<块引用>

未处理的异常:“List”类型不是“SubJsonModel”类型的子类型

ma​​in.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);
}

请问怎么解决这个问题

3 个答案:

答案 0 :(得分:1)

您可以使用 https://app.quicktype.io/ 从 json 创建 model.dart。

要解析此 JSON 数据,请执行 最后 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 :(得分:1)

我注意到了一些问题,并根据您提供的信息进行了更正。 阅读评论。向问题添加示例响应正文。

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

答案 2 :(得分:1)

所以在这里我首先在 this online tool 的帮助下创建一个模型类。然后更改代码,例如先将子类别保存在一个列表中,然后将其传递给主列表,然后打印

这是我的 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,
      };
}