将 json 解析为 flutter List<dynamic> 到 Map<String, dynamic>

问题描述

你好,我想解析 Json,我遇到了这个问题,有什么问题请帮助
错误是“List”不是“Map”类型的子类型
模型

class CategoriesModel {
  CategoriesModel({
    this.id,this.title,this.price,this.description,this.image,});

  int? id;
  String? title;
  double? price;
  String? description;
  String? image;

  factory CategoriesModel.fromJson(Map<String,dynamic> json) {
    return CategoriesModel(
      id: json["id"],title: json["title"],price: json["price"].todouble(),description: json["description"],image: json["image"],);
  }


  Map<String,dynamic> toMap() => {
    "id": id,"title": title,"price": price,"description": description,"image": image,};
}

cubit我做到了(AppCubit.dart)

CategoriesModel? categoriesModel ;

   getCategories(){
    emit(OnLoadingCategoriesstate());
    dioHelper.getData(pathUrl: "products").then((value){
      categoriesModel = CategoriesModel.fromJson(value.data);
      // catList =  (value.data as List)
      //     .map((x) => CategoriesModel.fromJson(x))
      //     .toList();
      // print(catList.length);

      emit(OnSuccessCategoriesstate());
    }).catchError((error){
      emit(OnCatchErrorCategoriesstate(error.toString()));
      print(error.toString());
    });
  }

dio Helper 中我做了一般的功能来使用它

  static Future<Response> getData({required pathUrl})async{
   return await dio.get(pathUrl);
  }

这是来自 json

的小数据
[
  {
    "id": 1,"title": "Fjallraven - Foldsack No. 1 Backpack,Fits 15 Laptops","price": 109.95,"description": "Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve,your everyday","category": "men's clothing","image": "https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg"
  },{
    "id": 2,"title": "Mens Casual Premium Slim Fit T-Shirts ","price": 22.3,"description": "Slim-fitting style,contrast raglan long sleeve,three-button henley placket,light weight & soft fabric for breathable and comfortable wearing. And Solid stitched shirts with round neck made for durability and a great fit for casual fashion wear and diehard baseball fans. The Henley style round neckline includes a three-button placket.","image": "https://fakestoreapi.com/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg"
  },]

最后这是我看到的错误

I/Flutter (31455): onChange -- AppCubit,Change { currentState: Instance of 'OnLoadingCategoriesstate',nextState: Instance of 'OnCatchErrorCategoriesstate' }
I/Flutter (31455): type 'List<dynamic>' is not a subtype of type 'Map<String,dynamic>'

任何帮助我将不胜感激

解决方法

CategoriesModel.fromJson 期望类型为 Map<String,dynamic>,但 json 片段显示响应为 List

更新 .then 函数以处理列表并从 CategoriesModel 中的每个项目创建 List,类似于上面代码段中注释掉的代码。

 DioHelper.getData(pathUrl: "products").then((List values) {
     values.map((e) => CategoriesModel.fromJson(e)).toList();
 }