deepak
deepak

Reputation: 241

I am getting The method 'cast' was called on null while parsing json

I have following json in my API response :

{
    "data": [{
        "orderid": "123",
        "item_names": [
            "item1",
            "item2",
            "item3",
            "item4"
        ]
    }]
}

and i have following model class in dart :

class OrderListResponse {
  List<OrderListItemModel> data;

  OrderListResponse({this.data});

  OrderListResponse.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      data = new List<OrderListItemModel>();
      json['data'].forEach((v) {
        data.add(new OrderListItemModel.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
      data['data'] = this.data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class OrderListItemModel {
  String id;
  List<String> items;

  OrderListItemModel({this.id,
  this.items,

  });

  OrderListItemModel.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    items = json['item_names'].cast<String>();
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['item_names'] = this.items;
    return data;
  }
}

When I will get data in API it gives me an error The method 'cast' was called on null. I am not getting why it throws this error. Any solution for this ?

Upvotes: 1

Views: 2673

Answers (2)

Sajad Abdollahi
Sajad Abdollahi

Reputation: 1741

I recommend you to use this website to convert your jsons

and so on, to fix you're code you need to change

  OrderListItemModel.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    items = json['item_names'].cast<String>();
  }

to this

   OrderListItemModel.fromJson(Map<String, dynamic> json) {
    id = json['orderid'];
    items = json["item_names"] == null? [] : List<String>.from(json["item_names"].map((x) => x))
}

Upvotes: 6

Alex Domenici
Alex Domenici

Reputation: 769

You had a few mistakes in your code:

  • You are trying to cast a string to an array.
  • Your are trying to parse field id but the JSON field is orderid

Try this code:

import 'dart:convert';

void main() {
  var js = '''{
    "data": [{
        "orderid": "123",
        "item_names": [
            "item1",
            "item2",
            "item3",
            "item4"
        ]
    }]
}''';
  
  var orders = OrderListResponse.fromJson(json.decode(js));
  
  for (var order in orders.data) {
    print(order.id);
    for (var item in order.items) {
      print(item);
    }
  }
}


class OrderListResponse {
  List<OrderListItemModel> data;

  OrderListResponse({this.data});

  OrderListResponse.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      data = new List<OrderListItemModel>();
      json['data'].forEach((v) {
        data.add(new OrderListItemModel.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
      data['data'] = this.data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class OrderListItemModel {
  String id;
  List<String> items;

  OrderListItemModel({this.id,
  this.items,

  });

  OrderListItemModel.fromJson(Map<String, dynamic> json) {
    id = json['orderid'];
    items = List<String>.from(json["item_names"].map((x) => x));
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['orderid'] = this.id;
    data['item_names'] = this.items;
    return data;
  }
}

Upvotes: 1

Related Questions