【问题标题】:flutter : nested json parsing listflutter : 嵌套的 json 解析列表
【发布时间】:2020-05-21 00:47:41
【问题描述】:

我正在尝试从我的 json 代码中调用名称和费用 它是我的 json 主数组中的嵌套数组,主数组我可以处理它,但子数组我不能

"guideExtraServices": [
      {
        "Name": "Limousine",
        "Fees": 100
      },
      {
        "Name": "Bus",
        "Fees": 10000
      },
      {
        "Name": "Mini-Bus",
        "Fees": 5000
      }
    ], 

我不能这样做,因为在我试图调用“姓名”和“费用”时出现错误

type 'List<ExtraServices>' is not a subtype of type 'String'

这是我的类,用于映射导游数据以在列表视图中使用它

class TourGuide{
  String id;
  String name;
  String email;
  String password;
  List<ExtraServices> extraService;

  TourGuide({
      this.id,
      this.name,
      this.email,
      this.password,
    this.extraService,
  });

  TourGuide.fromJson(Map<String, dynamic> json){
    List<dynamic> extra = json['guideExtraServices'];
    List<ExtraServices> extraList = extra.map((i) => ExtraServices.fromJson(i)).toList();
id = json['id'].toString();
name = json['displayName'];
email = json['email'];
password = json['password'];
    extraService=extraList;
  }
}

这是一个额外的服务类,导游类依赖它来获取子数组

   class ExtraServices{
      String name;
      double fees;
      ExtraServices({
        this.name,
        this.fees
      });

      ExtraServices.fromJson(Map<String, dynamic> json){
        name = json['Name'];
        fees = json['Fees'].toDouble();
      }
    }

我使用 api 解码 json 的提供者方法

 Future<dynamic> tourGuideList() async {
        _isLoading = true;
        notifyListeners();
        print('Starting request');

        http.Response response = await http.get(Environment.tourGuide,
            headers: Environment.requestHeader);
        print('Completed request');
        print('respond data : ${response.body}');

        Map<String, dynamic> res = json.decode(response.body);
        var results;
        if (res['code'] == 200) {

          print('start load tourguide');
          _tourGuide = [];
          res['message'].forEach((v) {
            _tourGuide.add(new TourGuide.fromJson(v));  
          }); 

          results = true;
        } else {
          results =
              FailedRequest(code: 400, message: res['error'], status: false);
        }
        _isLoading = false;
        notifyListeners();
        return results;
      }

我不知道为什么我有一个错误,我无法修复它

【问题讨论】:

标签: json flutter dart


【解决方案1】:

请尝试以下代码:-

首先创建模型:-

class GuideResponseModel {
  List<GuideExtraServicesModel> guideExtraServiceList;

  GuideResponseModel({
    this.guideExtraServiceList
  });

  factory GuideResponseModel.fromJson(Map<String, dynamic> parsedJson) {
    try {
      List<GuideExtraServicesModel> guideExtraServiceModelList = new List();

      if (parsedJson.containsKey('guideExtraServices')) {
        var countryList = parsedJson['guideExtraServices'] as List;
        guideExtraServiceModelList =
            countryList.map((i) => GuideExtraServicesModel.fromJson(i)).toList();
      }

      return GuideResponseModel(
        guideExtraServiceList: guideExtraServiceModelList
      );
    } catch (e) {
      return null;
    }
  }
}
class GuideExtraServicesModel {
  String name;
  int fees;

  GuideExtraServicesModel({this.name,this.fees});

  factory GuideExtraServicesModel.fromJson(Map<String, dynamic> json) {
    return GuideExtraServicesModel(name: json['Name'],fees: json['Fees']);
  }
}

模型的第二个用户:-

String jsonData = '{"guideExtraServices": [{"Name": "Limousine","Fees": 100},{"Name": "Bus","Fees": 10000},{"Name": "Mini-Bus","Fees": 5000}]}';
final dynamic jsonResponse = json.decode(jsonData);
final GuideResponseModel responseModel = GuideResponseModel.fromJson(jsonResponse);
print('======${responseModel.guideExtraServiceList[0].name}----${responseModel.guideExtraServiceList[0].fees}');

【讨论】:

    【解决方案2】:

    我觉得你的json总共应该是这样的:

    {"guideExtraServices": [
          {
            "Name": "Limousine",
            "Fees": 100
          },
          {
            "Name": "Bus",
            "Fees": 10000
          },
          {
            "Name": "Mini-Bus",
            "Fees": 5000
          }
        ]}
    

    试试

    // To parse this JSON data, do
    //
    //     final tourGuide = tourGuideFromJson(jsonString);
    
    import 'dart:convert';
    
    TourGuide tourGuideFromJson(String str) => TourGuide.fromJson(json.decode(str));
    
    String tourGuideToJson(TourGuide data) => json.encode(data.toJson());
    
    class TourGuide {
        List<GuideExtraService> guideExtraServices;
    
        TourGuide({
            this.guideExtraServices,
        });
    
        factory TourGuide.fromJson(Map<String, dynamic> json) => TourGuide(
            guideExtraServices: List<GuideExtraService>.from(json["guideExtraServices"].map((x) => GuideExtraService.fromJson(x))),
        );
    
        Map<String, dynamic> toJson() => {
            "guideExtraServices": List<dynamic>.from(guideExtraServices.map((x) => x.toJson())),
        };
    }
    
    class GuideExtraService {
        String name;
        int fees;
    
        GuideExtraService({
            this.name,
            this.fees,
        });
    
        factory GuideExtraService.fromJson(Map<String, dynamic> json) => GuideExtraService(
            name: json["Name"],
            fees: json["Fees"],
        );
    
        Map<String, dynamic> toJson() => {
            "Name": name,
            "Fees": fees,
        };
    }
    

    【讨论】:

    • 先生,你为什么写这部分代码 Map toJson() => { "guideExtraServices": List.from(guideExtraServices.map((x) => x.toJson())), };
    • 它只是一个完整的类来实现 Json 和 Json。您永远不知道何时需要转换器。目前尝试 final tourGuide = tourGuideFromJson(jsonString);
    • 我会贴出我的方法,你可以看看吗?
    • 我现在添加了,先生
    • 你能发布完整的 json 响应吗?有没有属性码是200的?
    猜你喜欢
    • 2019-01-24
    • 2019-06-17
    • 2021-02-25
    • 2023-04-02
    • 2020-10-29
    • 2021-02-09
    • 2020-09-24
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多