为什么可以';t我从json-flatter获取数据值

为什么可以';t我从json-flatter获取数据值,json,flutter,dart,Json,Flutter,Dart,我试图使用flatter从我的json文件categories.json中获取值,但是我总是得到错误或者它没有显示出来,我真的不知道是什么错了 这是我的主飞镖 Future<List<Category>> loadData() async { String jString = await rootBundle.loadString("assets/categories.json"); List<dynamic> jRes

我试图使用flatter从我的json文件
categories.json
中获取值,但是我总是得到错误或者它没有显示出来,我真的不知道是什么错了 这是我的主飞镖

 Future<List<Category>> loadData() async {
    String jString = await rootBundle.loadString("assets/categories.json");
    List<dynamic> jRes = jsonDecode(jString);
    List<Category> datas = jRes.map((e) => Category.fromJson(e)).toList();
    return datas;
  }


Container(
  child: FutureBuilder<List<Category>>(
      future: loadData(),
      builder: (context, data) {
        if (data.connectionState != ConnectionState.waiting &&
            data.hasData) {
          var userList = data.data;
          return ListView.builder(
              itemCount: userList.length,
              itemBuilder: (context, index) {
                var userData = userList[index];
                return Column(
                  children: [
                    Text("Category: ${userData.catName}"),
                  ],
                );
              });
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      })),
class Category {
  String catId;
  String catName;
  SubCategory subcat;

  Category({this.catId, this.catName, this.subcat});
  factory Category.fromJson(Map<String, dynamic> json) {
    return Category(
      catId: json['cat_id'],
      catName: json['category'],
      subcat: SubCategory.fromJson(json['cat_subcategory']),
    );
  }
  Map<String, dynamic> toJson() {
    return {
      "cat_id": catId,
      "category": catName,
    };
  }
}

class SubCategory {
  String subName, subImage;

  SubCategory({this.subName, this.subImage});
  factory SubCategory.fromJson(Map<String, dynamic> json) {
    return SubCategory(subName: json['sub_name'], subImage: json['sub_image']);
  }
  Map<String, dynamic> toJson() {
    return {
      "sub_name": subName,
      "sub_image": subImage,
    };
  }
}

我运行它时面临的问题是,它只显示我的main.dart中的
CircularProgressIndicator(),它说
引发了另一个异常:NoSuchMethodError:getter'length'被调用为null。
请告诉我如何解决这个问题,如果您需要更多解释,请告诉我

PS:当我检查
loadData()
值时,它说
type'List'不是type'Map'的子类型

编辑:谢谢大家的回答,但我所做的是使用这个网站生成一个模型


我能够亲自获得值,当我想从json文件加载数据时,我会这样做:

  Future<List<Category>> loadData() async {
    List<Category> datas = [];
    return rootBundle.loadString("assets/categories.json").then((value) {
      List<dynamic> jRes = jsonDecode(value);
      jRes.forEach((element) {
        datas.add(Category.fromJson(element));
      });
      return datas;
    });
  }
您可以看到cat_子类别是一个列表

因此,您为您的子类别.fromJson()提供了一个列表,而不是一个映射。 如果你想给出一个地图,你可以简单地给出列表的第一个索引

您的Category.fromJson()变为

factory Category.fromJson(映射json){
退货类别(
catId:json['cat_id'],
catName:json['category'],
subcat:SubCategory.fromJson(json['cat_SubCategory'][0]),
);
}

更改您的模型。省道类

class Category {
String category;
String catId;
List<CatSubcategory> catSubcategory;

Category({this.category, this.catId, this.catSubcategory});

Category.fromJson(Map<String, dynamic> json) {
category = json['category'];
catId = json['cat_id'];
if (json['cat_subcategory'] != null) {
  catSubcategory = new List<CatSubcategory>();
  json['cat_subcategory'].forEach((v) {
    catSubcategory.add(new CatSubcategory.fromJson(v));
  });
}}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['category'] = this.category;
data['cat_id'] = this.catId;
if (this.catSubcategory != null) {
  data['cat_subcategory'] =
      this.catSubcategory.map((v) => v.toJson()).toList();
}
return data;
}}

class CatSubcategory {
String subName;
String subImage;

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

CatSubcategory.fromJson(Map<String, dynamic> json) {
subName = json['sub_name'];
subImage = json['sub_image'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['sub_name'] = this.subName;
data['sub_image'] = this.subImage;
return data;
}}
类别{
字符串类别;
字符串catId;
列出子类别;
类别({this.Category,this.catId,this.catSubcategory});
Category.fromJson(映射json){
category=json['category'];
catId=json['cat_id'];
如果(json['cat_subcategory']!=null){
catSubcategory=新列表();
json['cat_subcategory'].forEach((v){
添加(新的catSubcategory.fromJson(v));
});
}}
映射到JSON(){
最终地图数据=新地图();
数据['category']=this.category;
数据['cat_id']=this.catId;
if(this.catSubcategory!=null){
数据['cat_子类别']=
this.catSubcategory.map((v)=>v.toJson()).toList();
}
返回数据;
}}
类CatSubcategory{
字符串子名称;
字符串子图像;
CatSubcategory({this.subName,this.subImage});
CatSubcategory.fromJson(映射json){
subName=json['sub_name'];
subImage=json['sub_image'];
}
映射到JSON(){
最终地图数据=新地图();
数据['sub_name']=this.subName;
数据['sub_image']=this.subImage;
返回数据;
}}
替换

List<Category> datas = jRes.map((e) => Category.fromJson(e)).toList();
List data=jRes.map((e)=>Category.fromJson(e)).toList();

List data=List.from(jRes.map((category)=>category.fromJson(category));

如果删除
如果
语句,则无法初始化数据。您是否尝试检查数据的有效状态
loadData
方法返回了有效结果?@fartem如何检查它是否有效。抱歉,我是新来的。您可以调试应用程序或在日志中打印变量。@fartem它说
类型“List”不是类型“Map”的子类型。
尝试将文件解析为对象,而不是列表。使用
Map
而不是
List
。你能发布你的JSON文件吗?
factory Category.fromJson(Map<String, dynamic> json) {
    return Category(
      catId: json['cat_id'],
      catName: json['category'],
      subcat: SubCategory.fromJson(json['cat_subcategory'][0]),
    );
  }
class Category {
String category;
String catId;
List<CatSubcategory> catSubcategory;

Category({this.category, this.catId, this.catSubcategory});

Category.fromJson(Map<String, dynamic> json) {
category = json['category'];
catId = json['cat_id'];
if (json['cat_subcategory'] != null) {
  catSubcategory = new List<CatSubcategory>();
  json['cat_subcategory'].forEach((v) {
    catSubcategory.add(new CatSubcategory.fromJson(v));
  });
}}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['category'] = this.category;
data['cat_id'] = this.catId;
if (this.catSubcategory != null) {
  data['cat_subcategory'] =
      this.catSubcategory.map((v) => v.toJson()).toList();
}
return data;
}}

class CatSubcategory {
String subName;
String subImage;

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

CatSubcategory.fromJson(Map<String, dynamic> json) {
subName = json['sub_name'];
subImage = json['sub_image'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['sub_name'] = this.subName;
data['sub_image'] = this.subImage;
return data;
}}
List<Category> datas = jRes.map((e) => Category.fromJson(e)).toList();
List<Category> datas = List<Category>.from(jRes.map((category)=> Category.fromJson(category)));