为什么可以';t我从json-flatter获取数据值
我试图使用flatter从我的json文件为什么可以';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
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)));