简体   繁体   中英

flutter : nested json parsing list

I am trying to call Name and Fees from my json code it is nested array from main array of my json the main array i can deal with it but the sub array i can't

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

And I can't do that because of the error here when iam tring to call 'Name' and 'Fees'

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

and this is my class for mapping tour guide data to use it in list view

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;
  }
}

and this is a Extra Services class which tour guide class depend on to get the sub array

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

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

my provider method for decode json using for api

 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;
      }

and I don't know why I have an error and I can't fix it

I think your json should be like this in total:

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

Try

// 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,
    };
}

Please try the below code :-

First Create Model :-

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']);
  }
}

Second User the Model:-

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}');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM