简体   繁体   中英

Error in json parsing on flutter. type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'ResultData' in type cast

I have json as below.

{  
   "result_data":{  
      "id":"b57457b0-4f73-11e8-92ae-01912016d38c",
      "rates":[  
         {  },
         {  }
      ]
   }
}

I want to parse and below is my code to parse it. To get the "result_data"

class RootModel {
  ResultData resultData;

  RootModel(this.resultData);

  RootModel.fromJSON(Map<String, dynamic> response) {
    var list = response['result_data'] as ResultData;
    print(list.runtimeType);
  }
}

To parse the result data object.

class ResultData {
  String id;
  List<Rate> rates;
  ResultData(this.id, this.rates);

  ResultData.fromJSON(Map<String, dynamic> parsedJson) {
    this.id = parsedJson['id'] as String;
    this.rates = (parsedJson['rates'] as List)
        .map((json) => Rate.fromJSON(json))
        .toList();
  }
}

Further rates model has also other models and list of models. The error I am getting for the above code is:

 E/flutter: [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
    type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'ResultData' in type cast
    #0      new RootModel.fromJSON (package:movies_streams/models/RootModel.dart:16:40)

You can't cast map to ResultData.

class RootModel {
  ResultData resultData;

  RootModel(this.resultData);

  RootModel.fromJSON(Map<String, dynamic> response) {
//    var list = response['result_data'] as ResultData;
    var list = ResultData.fromJSON(response['result_data']);
    print(list.runtimeType);
  }
}

There is no magic happening for JSON deserialization. You have to invoke the fromJSON yourself, instead of just casting:

class RootModel {
  ResultData resultData;

  RootModel(this.resultData);

  RootModel.fromJSON(Map<String, dynamic> response)
    : resultData =  ResultData.fromJSON(response['result_data'] as Map<String, dynamic>);

}

One possible way to avoid such problems is to use special tools to create data models.

For example: json_serializable or others.

Below is an example of what the code might look like, which you would have to write with your hands and, perhaps, make some inaccuracies.

// Generated by 'yaml2podo'
// Version: 0.1.11
// https://pub.dev/packages/yaml2podo

class ResultData {
  final List rates;

  ResultData({this.rates});

  factory ResultData.fromJson(Map map) {
    return ResultData(rates: _toList(map['rates'], (e) => e));
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['rates'] = _fromList(rates, (e) => e);
    return result;
  }
}

class RootModel {
  final ResultData resultData;

  RootModel({this.resultData});

  factory RootModel.fromJson(Map map) {
    return RootModel(
        resultData: _toObject(
            map['result_data'], (e) => ResultData.fromJson(e as Map)));
  }

  Map<String, dynamic> toJson() {
    var result = <String, dynamic>{};
    result['result_data'] = resultData?.toJson();
    return result;
  }
}

List _fromList(dynamic data, dynamic Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

List<T> _toList<T>(dynamic data, T Function(dynamic) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element);
    }
    result.add(value);
  }
  return result;
}

T _toObject<T>(dynamic data, T Function(dynamic) fromJson) {
  if (data == null) {
    return null;
  }
  return fromJson(data);
}

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