Shalahudin Al Ayyuby
Shalahudin Al Ayyuby

Reputation: 49

parsing complex json flutter list<map> in list

I have a json response where there is a list that contains a list, then there is a map in it, I tried to parse it but it failed, what kind of error did I do? Previously I used this method to parse the map that was in the list and it worked

response json

{
    "status": "success",
    "data": [
        {
            "id_category": 1,
            "category_slug": "cc",
            "category_name": "Credit Card",
            "data_payment": [
                {
                    "payment_slug": "cc",
                    "payment_name": "Credit Card",
                    "payment_logo": "https://cdn.xx.id/assets_midtrans/cc.png"
                }
            ]
        }
    ],
    "message": "Success Get Data"
}




mycode

class PaymentMethodListModel {
  final String status, message;
  final List<_Data> data;

  PaymentMethodListModel({
    this.status,
    this.message,
    this.data,
  });

  factory PaymentMethodListModel.fromJson(Map<String, dynamic> x) {
    var list = x['data'] as List;
    print(list.runtimeType);
    List<_Data> sd = list.map((i) => _Data.fromJson(i)).toList();
    return PaymentMethodListModel(
      status: x['status'],
      data: sd,
      message: x['message'],
    );
  }
}

class _Data {
  final String categorySlug, categoryName;
  final List<DataPayment> dataPayment;
  _Data({
    this.categorySlug,
    this.categoryName,
    this.dataPayment,
  });

  factory _Data.fromJson(Map<String, dynamic> obj) {
    var list = obj['data_payment'] as List;
    List<DataPayment> dataPaymentList = list.map((i) => DataPayment.fromJson(i)).toList();

    return _Data(
      categorySlug: obj['category_slug'],
      categoryName: obj['category_name'],
      dataPayment: dataPaymentList,
    );
  }
}

class DataPayment {
  final String paymentSlug, paymentName, paymentLogo;

  DataPayment({
    this.paymentSlug,
    this.paymentName,
    this.paymentLogo,
  });

  factory DataPayment.fromJson(Map<String, dynamic> x) => DataPayment(
        paymentSlug: x['payment_slug'],
        paymentName: x['payment_name'],
        paymentLogo: x['payment_logo'],
      );
}




error message
The method 'map' was called on null. Receiver: null Tried calling: map(Closure: (dynamic) => DataPayment)

Upvotes: 1

Views: 695

Answers (1)

Priyesh
Priyesh

Reputation: 1313

Try below code

var paymentListModel = PaymentListModel.fromJson(json.decode(str));


class PaymentListModel {
    PaymentListModel({
        this.status,
        this.data,
        this.message,
    });

    String status;
    List<Datum> data;
    String message;

    factory PaymentListModel.fromJson(Map<String, dynamic> json) => PaymentListModel(
        status: json["status"],
        data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
        message: json["message"],
    );

    Map<String, dynamic> toJson() => {
        "status": status,
        "data": List<dynamic>.from(data.map((x) => x.toJson())),
        "message": message,
    };
}

class Datum {
    Datum({
        this.idCategory,
        this.categorySlug,
        this.categoryName,
        this.dataPayment,
    });

    int idCategory;
    String categorySlug;
    String categoryName;
    List<DataPayment> dataPayment;

    factory Datum.fromJson(Map<String, dynamic> json) => Datum(
        idCategory: json["id_category"],
        categorySlug: json["category_slug"],
        categoryName: json["category_name"],
        dataPayment: List<DataPayment>.from(json["data_payment"].map((x) => DataPayment.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "id_category": idCategory,
        "category_slug": categorySlug,
        "category_name": categoryName,
        "data_payment": List<dynamic>.from(dataPayment.map((x) => x.toJson())),
    };
}

class DataPayment {
    DataPayment({
        this.paymentSlug,
        this.paymentName,
        this.paymentLogo,
    });

    String paymentSlug;
    String paymentName;
    String paymentLogo;

    factory DataPayment.fromJson(Map<String, dynamic> json) => DataPayment(
        paymentSlug: json["payment_slug"],
        paymentName: json["payment_name"],
        paymentLogo: json["payment_logo"],
    );

    Map<String, dynamic> toJson() => {
        "payment_slug": paymentSlug,
        "payment_name": paymentName,
        "payment_logo": paymentLogo,
    };
}

Upvotes: 2

Related Questions