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.