Advanced json parse in dart - json

I want to parse this Json. Now i am parsing Load as a class with 2 fields: id, and value. But what i want to is to parse it like Map<int, String>. When i am trying to cast the object, flutter gives me an error. for example:
Map<int, String> map = {
38 : "#1038 Fort Dodge, IA - Algona, IA",
39 : "#1039 Louisville, KY - Louisville, KY"
}
it is not the same as this question
{
"loads": {
"data": [
{
"id": 38,
"value": "#1038 Fort Dodge, IA - Algona, IA"
},
{
"id": 39,
"value": "#1039 Louisville, KY - Louisville, KY"
}
]
},
"date_ranges": {
"data": [
{
"id": "all_time",
"value": "All"
},
{
"id": "this_year",
"value": "This year"
}
]
}
}

You can create pojo class to parse your JSON
TestModel testModel = TestModel.fromJson(yourResponse);
class TestModel {
Loads loads;
Loads dateRanges;
TestModel({this.loads, this.dateRanges});
TestModel.fromJson(Map<String, dynamic> json) {
loads = json['loads'] != null ? new Loads.fromJson(json['loads']) : null;
dateRanges = json['date_ranges'] != null
? new Loads.fromJson(json['date_ranges'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.loads != null) {
data['loads'] = this.loads.toJson();
}
if (this.dateRanges != null) {
data['date_ranges'] = this.dateRanges.toJson();
}
return data;
}
}
class Loads {
List<Data> data;
Loads({this.data});
Loads.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) {
data = new List<Data>();
json['data'].forEach((v) {
data.add(new Data.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 Data {
int id;
String value;
Data({this.id, this.value});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['value'] = this.value;
return data;
}
}
class Data {
String id;
String value;
Data({this.id, this.value});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['value'] = this.value;
return data;
}
}

There was a issue you found because loads and date_ranges contain same child name data but there properties are different that's why your model class return error
Here I write a code for loads, please have a look
void main() {
Map<int, String> map = {
};
var mapdata = {
"loads": {
"data": [
{
"id": 50,
"value": "#1038 Fort Dodge, IA - Algona, IA"
},
{
"id": 39,
"value": "#1039 Louisville, KY - Louisville, KY"
}
]
},
"date_ranges": {
"data": [
{
"id": "all_time",
"value": "All"
},
{
"id": "this_year",
"value": "This year"
}
]
}
};
TestModel test = TestModel.fromJson(mapdata);
test.loads.data.forEach((e)=>map[e.id]=e.value);
print(map);
}
class TestModel {
Loads loads;
Loads dateRanges;
TestModel({this.loads, this.dateRanges});
TestModel.fromJson(Map<String, dynamic> json) {
loads = json['loads'] != null ? new Loads.fromJson(json['loads']) : null;
dateRanges = json['date_ranges'] != null
? new Loads.fromJson(json['date_ranges'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.loads != null) {
data['loads'] = this.loads.toJson();
}
if (this.dateRanges != null) {
data['date_ranges'] = this.dateRanges.toJson();
}
return data;
}
}
class Loads {
List<Data> data;
Loads({this.data});
Loads.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) {
data = new List<Data>();
json['data'].forEach((v) {
data.add(new Data.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 Data {
var id; // here changes the type
String value;
Data({this.id, this.value});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
value = json['value'];
}
Map<String, String> toJson() {
final Map<String, String> data = new Map<String, String>();
data['id'] = this.id;
data['value'] = this.value;
return data;
}
}
map result:
{50: #1038 Fort Dodge, IA - Algona, IA, 39: #1039 Louisville, KY - Louisville, KY}
N.B: Make your id dynamic with var type

Related

Trying to convert Json to Dart but its giving me 3 errors

I am trying to convert JSON response to dart but over 3 error. I convert the Json from online website https://javiercbk.github.io/json_to_dart/
the errors says : The method 'toJson' isn't defined for the type 'List'.
Try correcting the name to the name of an existing method, or defining a method named 'toJson'.
the code :
class RedZoneModel {
bool? status;
List<Data>? data;
RedZoneModel({this.status, this.data});
RedZoneModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
if (json['data'] != null) {
data = <Data>[];
json['data'].forEach((v) { data!.add(new Data.fromJson(v)); });
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
if (this.data != null) {
data['data'] = this.data!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Data {
int? id;
String? areaName;
Geojson? geojson;
String? createdAt;
String? updatedAt;
Data({this.id, this.areaName, this.geojson, this.createdAt, this.updatedAt});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
areaName = json['area_name'];
geojson = json['geojson'] != null ? new Geojson.fromJson(json['geojson']) : null;
createdAt = json['created_at'];
updatedAt = json['updated_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['area_name'] = this.areaName;
if (this.geojson != null) {
data['geojson'] = this.geojson!.toJson();
}
data['created_at'] = this.createdAt;
data['updated_at'] = this.updatedAt;
return data;
}
}
class Geojson {
String? type;
List<List>? coordinates;
Geojson({this.type, this.coordinates});
Geojson.fromJson(Map<String, dynamic> json) {
type = json['type'];
if (json['coordinates'] != null) {
coordinates = <List>[];
json['coordinates'].forEach((v) { coordinates!.add(new List.fromJson(v)); }); // ! Error at List.fromJson(v)
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
if (this.coordinates != null) {
data['coordinates'] = this.coordinates!.map((v) => v.toJson()).toList(); // ! Error at v.toJson()
}
return data;
}
}
class Coordinates {
Coordinates({ }); // ! Error at Coordinates({ });
Coordinates.fromJson(Map<String, dynamic> json) {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
return data;
}
}
and this is the response :
{
"status": true,
"data": [
{
"id": 8,
"area_name": "Surian",
"geojson": {
"type": "Polygon",
"coordinates": [
[
[
-1.2453052,
460.8429751
],
[
-1.2200768,
460.9066456
],
[
-1.2564606,
460.9423423
],
[
-1.2940451,
460.8711205
],
[
-1.2453052,
460.8429751
],
[
-1.2940451,
460.8711205
],
[
-1.2453052,
460.8429751
]
]
]
},
"created_at": "2022-08-29T14:30:10.000000Z",
"updated_at": "2022-12-19T18:30:10.000000Z"
},
{
"id": 13,
"area_name": "test edit",
"geojson": {
"type": "Polygon",
"coordinates": [
[
[
123,
123
],
[
123,
123
],
[
123,
123
],
[
123,
123
],
[
123,
123
]
]
]
},
"created_at": "2022-08-29T15:43:35.000000Z",
"updated_at": "2022-12-20T08:28:00.000000Z"
}
]
}
Anyone have any suggestion?
You shouldn't really use online generators that convert JSON to Dart objects.
Instead, learn about json and serialization. You can use dart packages such as freezed and json_serializable to generate the encoding boilerplate for your JSON response.
Here is sample json to Dart object converter for your json response above:
class Data {
const Data({
required this.id,
required this.area_name,
required this.geojson,
required this.created_at,
required this.updated_at,
});
factory Data.fromJson(Map<String, dynamic> json) => Data(
id: json['id'] as int,
area_name: json['area_name'] as String,
geojson: GeoJson.fromJson(json['geojson'] as Map<String, dynamic>),
created_at: DateTime.parse(json['created_at'] as String),
updated_at: DateTime.parse(json['updated_at'] as String),
);
final int id;
final String area_name;
final GeoJson geojson;
final DateTime created_at;
final DateTime updated_at;
}
class GeoJson {
const GeoJson({
required this.type,
required this.coordinates,
});
factory GeoJson.fromJson(Map<String, dynamic> json) => GeoJson(
type: json['type'] as String,
coordinates: (json['coordinates'] as List<dynamic>)
.map((e) => Polygon.fromJson(e as Map<String, dynamic>))
.toList(),
);
final String type;
final List<Polygon> coordinates;
}
class Polygon {
const Polygon({
required this.lat,
required this.lang,
});
/// Creates a Polygon from Json map
factory Polygon.fromJson(Map<String, dynamic> json) => Polygon(
lat: json['lat'] as num,
lang: json['lang'] as num,
);
final num lat;
final num lang;
}

How can i handle multiple data type for a same key from API in Flutter?

Let's explain my problem..
suppose have a json object like
from this picture i want to handle offer_price key
enter image description here
{
"product": [
{
"id": 1,
"price": 100.0,
"offer_price": 40
},
{
"id": 2,
"price": 80.0,
"offer_price": 10.50
},
{
"id": 3,
"price": 200.0,
"offer_price": "40.5"
},
{
"id": 4,
"price": 100.0,
"offer_price": null,
}
]
}
class Product {
int? id;
int? price;
// if you need the value as String
String? offerPriceAsString;
// Value as a double
double? offerPrice;
Product({this.id, this.price, this.offerPrice});
Product.fromJson(Map<String, dynamic> json) {
id = json['id'];
price = json['price'];
double.parse("1.0");
// Any value to String
offerPriceAsString = json['offer_price'].toString();
// String to Double
offerPrice = double.parse(json['offer_price'].toString());
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['price'] = price;
data['offer_price'] = offerPrice;
return data;
}
}
In the dart data model for offer_price field make its datatype as dynamic via which you'll be able to have a dynamic data in it as run type. And while consuming this in any place just check the runtimeType of the variable and use it by type casting or just using it with .toString().
eg class:
class Products {
Products({this.product});
Products.fromJson(Map<String, dynamic> json) {
if (json['product'] != null) {
product = <Product>[];
json['product'].forEach((v) {
product!.add(Product.fromJson(v));
});
}
}
List<Product>? product;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (this.product != null) {
data['product'] = this.product!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Product {
Product({this.id, this.price, this.offerPrice});
Product.fromJson(Map<String, dynamic> json) {
id = json['id'];
price = json['price'];
offerPrice = json['offer_price'];
}
int? id;
int? price;
dynamic? offerPrice;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = this.id;
data['price'] = this.price;
data['offer_price'] = this.offerPrice;
return data;
}
}
For consuming it just try:
Products products = List<Products>[];
//assign products = Products.fromJson(jsonData);
//using
products[i].offerPrice == null
? "null"
: products[i].offerPrice.runtimeType == String
? products[i].offerPrice.toString()
: products[i].offerPrice.runtimeType == Int
? int.parse(products[i].offerPrice)
: products[i].offerPrice.runtimeType == Double
? double.parse(products[i].offerPrice)
: ""

How to parse a complex JSON file in Flutter

I'm having a really complex JSON file to parse:
{
"adult": false,
"backdrop_url": "https://image.tmdb.org/t/p/w500/gLbBRyS7MBrmVUNce91Hmx9vzqI.jpg",
"belongs_to_collection": {
"id": 230,
"name": "The Godfather Collection",
"poster_url": "https://image.tmdb.org/t/p/w200/sSbkKCHtIEakht5rnEjrWeR2LLG.jpg",
"backdrop_url": "https://image.tmdb.org/t/p/w500/3WZTxpgscsmoUk81TuECXdFOD0R.jpg"
},
"budget": 13000000,
"genres": [
"Drama",
"Crime"
],
"homepage": null,
"id": 240,
"imdb_id": "tt0071562",
"original_language": "en",
"original_title": "The Godfather: Part II",
"overview": "In the continuing saga of the Corleone crime family, a young Vito Corleone grows up in Sicily and in 1910s New York. In the 1950s, Michael Corleone attempts to expand the family business into Las Vegas, Hollywood and Cuba.",
"popularity": 17.578,
"poster_url": "https://image.tmdb.org/t/p/w200/bVq65huQ8vHDd1a4Z37QtuyEvpA.jpg",
"production_companies": [
{
"id": 4,
"logo_url": "https://image.tmdb.org/t/p/w200/fycMZt242LVjagMByZOLUGbCvv3.png",
"name": "Paramount",
"origin_country": "US"
},
{
"id": 536,
"logo_url": null,
"name": "The Coppola Company",
"origin_country": ""
}
],
"production_countries": [
{
"iso_3166_1": "US",
"name": "United States of America"
}
],
"release_date": "1974-12-20",
"revenue": 102600000,
"runtime": 200,
"spoken_languages": [
{
"iso_639_1": "en",
"name": "English"
},
{
"iso_639_1": "it",
"name": "Italiano"
},
{
"iso_639_1": "la",
"name": "Latin"
},
{
"iso_639_1": "es",
"name": "EspaƱol"
}
],
"status": "Released",
"tagline": "I don't feel I have to wipe everybody out, Tom. Just my enemies.",
"title": "The Godfather: Part II",
"video": false,
"vote_average": 8.5,
"vote_count": 4794
}
And this is my class for parsing:
class movieDetails {
bool? adult;
String? backdropUrl;
Null? belongsToCollection;
int? budget;
List<String>? genres;
Null? homepage;
int? id;
String? imdbId;
String? originalLanguage;
String? originalTitle;
String? overview;
double? popularity;
String? posterUrl;
List<ProductionCompanies>? productionCompanies;
List<ProductionCountries>? productionCountries;
String? releaseDate;
int? revenue;
int? runtime;
List<SpokenLanguages>? spokenLanguages;
String? status;
String? tagline;
String? title;
bool? video;
double? voteAverage;
int? voteCount;
movieDetails(
{this.adult,
this.backdropUrl,
this.belongsToCollection,
this.budget,
this.genres,
this.homepage,
this.id,
this.imdbId,
this.originalLanguage,
this.originalTitle,
this.overview,
this.popularity,
this.posterUrl,
this.productionCompanies,
this.productionCountries,
this.releaseDate,
this.revenue,
this.runtime,
this.spokenLanguages,
this.status,
this.tagline,
this.title,
this.video,
this.voteAverage,
this.voteCount});
movieDetails.fromJson(Map<String, dynamic> json) {
adult = json['adult'];
backdropUrl = json['backdrop_url'];
belongsToCollection = json['belongs_to_collection'];
budget = json['budget'];
genres = json['genres'].cast<String>();
homepage = json['homepage'];
id = json['id'];
imdbId = json['imdb_id'];
originalLanguage = json['original_language'];
originalTitle = json['original_title'];
overview = json['overview'];
popularity = json['popularity'];
posterUrl = json['poster_url'];
if (json['production_companies'] != null) {
productionCompanies = <ProductionCompanies>[];
json['production_companies'].forEach((v) {
productionCompanies!.add(new ProductionCompanies.fromJson(v));
});
}
if (json['production_countries'] != null) {
productionCountries = <ProductionCountries>[];
json['production_countries'].forEach((v) {
productionCountries!.add(new ProductionCountries.fromJson(v));
});
}
releaseDate = json['release_date'];
revenue = json['revenue'];
runtime = json['runtime'];
if (json['spoken_languages'] != null) {
spokenLanguages = <SpokenLanguages>[];
json['spoken_languages'].forEach((v) {
spokenLanguages!.add(new SpokenLanguages.fromJson(v));
});
}
status = json['status'];
tagline = json['tagline'];
title = json['title'];
video = json['video'];
voteAverage = json['vote_average'];
voteCount = json['vote_count'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['adult'] = this.adult;
data['backdrop_url'] = this.backdropUrl;
data['belongs_to_collection'] = this.belongsToCollection;
data['budget'] = this.budget;
data['genres'] = this.genres;
data['homepage'] = this.homepage;
data['id'] = this.id;
data['imdb_id'] = this.imdbId;
data['original_language'] = this.originalLanguage;
data['original_title'] = this.originalTitle;
data['overview'] = this.overview;
data['popularity'] = this.popularity;
data['poster_url'] = this.posterUrl;
if (this.productionCompanies != null) {
data['production_companies'] =
this.productionCompanies!.map((v) => v.toJson()).toList();
}
if (this.productionCountries != null) {
data['production_countries'] =
this.productionCountries!.map((v) => v.toJson()).toList();
}
data['release_date'] = this.releaseDate;
data['revenue'] = this.revenue;
data['runtime'] = this.runtime;
if (this.spokenLanguages != null) {
data['spoken_languages'] =
this.spokenLanguages!.map((v) => v.toJson()).toList();
}
data['status'] = this.status;
data['tagline'] = this.tagline;
data['title'] = this.title;
data['video'] = this.video;
data['vote_average'] = this.voteAverage;
data['vote_count'] = this.voteCount;
return data;
}
}
class ProductionCompanies {
int? id;
String? logoUrl;
String? name;
String? originCountry;
ProductionCompanies({this.id, this.logoUrl, this.name, this.originCountry});
ProductionCompanies.fromJson(Map<String, dynamic> json) {
id = json['id'];
logoUrl = json['logo_url'];
name = json['name'];
originCountry = json['origin_country'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['logo_url'] = this.logoUrl;
data['name'] = this.name;
data['origin_country'] = this.originCountry;
return data;
}
}
class ProductionCountries {
String? iso31661;
String? name;
ProductionCountries({this.iso31661, this.name});
ProductionCountries.fromJson(Map<String, dynamic> json) {
iso31661 = json['iso_3166_1'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['iso_3166_1'] = this.iso31661;
data['name'] = this.name;
return data;
}
}
class SpokenLanguages {
String? iso6391;
String? name;
SpokenLanguages({this.iso6391, this.name});
SpokenLanguages.fromJson(Map<String, dynamic> json) {
iso6391 = json['iso_639_1'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['iso_639_1'] = this.iso6391;
data['name'] = this.name;
return data;
}
}
Since I'm getting this JSON from the internet, here's the fetching method:
Future<movieDetails> fetchDetails() async {
final response = await http.get(Uri.parse(url)); //url: just a string containing the website's URL
if (response.statusCode == 200){
return compute(parseDetails, response.body);
}
else{
throw Exception('Failed!');
}
}
Everything seems okay from here, but then I have literally no idea how to do the parseDetails function. How should I do it? This JSON file is too complex for me to handle.
Is there any reason you're using compute to parse the JSON file? The file you provided seems to have reasonable length and won't block the main isolate (unless the file is much bigger than what you provided, where compute might be appropriate)
Your code will be something like this (will parse the JSON response in the main isolate). For more details see the official documentation about JSON. Also a tip, follow the dart naming convention PascalCase for classes (MovieDetails instead of movieDetails)
Future<movieDetails> fetchDetails() async {
final response = await http.get(Uri.parse(url)); //url: just a string containing the website's URL
if (response.statusCode == 200){
Map<String, dynamic> movieDetailsMap = jsonDecode(response.body);
return movieDetails.fromJson(movieDetailsMap);
}
else{
throw Exception('Failed!');
}
}
movieDetails parseDetails(String responseBody) {
final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return movieDetails.fromJson(parsed);
}

How to parse in nested json array in ListView.Builder in Flutter

I'm calling an api which returns a nested json array list and when i try to display an id of table_photos inside listview.builder then it is displaying only id:1. I want to display all three id's which is id:1,id:11,id:12 inside listview.builder. Below is the sample json along with the code and MainPage.dart i'm displaying only short code due to the long file
JSON
{
"message": "Tables returend",
"tables": [
{
"id": "7"
"table_photos": [
{
"id": "7"
}
]
},
{
"id": "6",
"table_photos": [
{
"id": "1"
},
{
"id": "11"
},
{
"id": "12"
}
]
}
]
}
Model
class TableGenerateTablesTablePhotos {
String? id;
TableGenerateTablesTablePhotos({
this.id,
});
TableGenerateTablesTablePhotos.fromJson(Map<String, dynamic> json) {
id = json["id"]?.toString();
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data["id"] = id;
return data;
}
}
class TableGenerateTables {
String? id;
List<TableGenerateTablesTablePhotos?>? tablePhotos;
TableGenerateTables({
this.id,
this.tablePhotos,
});
TableGenerateTables.fromJson(Map<String, dynamic> json) {
id = json["id"]?.toString();
if (json["table_photos"] != null) {
final v = json["table_photos"];
final arr0 = <TableGenerateTablesTablePhotos>[];
v.forEach((v) {
arr0.add(TableGenerateTablesTablePhotos.fromJson(v));
});
tablePhotos = arr0;
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data["id"] = id;
if (tablePhotos != null) {
final v = tablePhotos;
final arr0 = [];
v!.forEach((v) {
arr0.add(v!.toJson());
});
data["table_photos"] = arr0;
}
return data;
}
}
class TableGenerate {
String? message;
List<TableGenerateTables?>? tables;
TableGenerate({
this.message,
this.tables,
});
TableGenerate.fromJson(Map<String, dynamic> json) {
message = json["message"]?.toString();
if (json["tables"] != null) {
final v = json["tables"];
final arr0 = <TableGenerateTables>[];
v.forEach((v) {
arr0.add(TableGenerateTables.fromJson(v));
});
tables = arr0;
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data["message"] = message;
if (tables != null) {
final v = tables;
final arr0 = [];
v!.forEach((v) {
arr0.add(v!.toJson());
});
data["tables"] = arr0;
}
return data;
}
}
Repository
class Repository{
Future<List< TableGenerateTables >?> makeRequestTables(int id, int count) async {
var response = await http.get(
Uri.parse('API_URL'));
if (response.statusCode == 200) {
var data = jsonDecode(response.body);
List< TableGenerateTables >? tables =
TableGenerate.fromJson(data).tables as List< TableGenerateTables >;
return tables;
} else {
throw Exception();
}
}
}
MainPage.dart
Widget showTable(List<TablesTables> data) {
return ListView.builder(
shrinkWrap: true,
itemCount: data.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(data[index].tablePhotos![index]!.id!), //It is displaying "1"
],
),
);
});
}

error when trying to decode json and casting it

I am trying to decode complex json data and always resulting in error.
Below are my json data:
{
"status_code": 200,
"message": "Successfully get data user",
"data": {
"sec_user": {
"clientIp": "1.4.2.54",
"officeid": "N/A",
},
"username": "uname",
"name1": "",
"menus": [
{
"appl_id": "MTC",
"menu_caption": "Master",
"menu_path": "/master",
"submenus": [
{
"menu_caption": "Machine List",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/machine_list"
},
{
"menu_caption": "Sparepart Category",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/sparepart_category"
}
]
},
{
"appl_id": "MTC",
"menu_caption": "Master",
"menu_path": "/master",
"submenus": [
{
"menu_caption": "Machine List",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/machine_list"
}
]
},
]
}
}
and I already create a model class using json to dart (and already retouch it a bit) and use json annotation and build runner. Then I get an error everytime I tried to decode the body of this json
if (jsonResponse.statusCode == 200) {
final jsonItems =
json.decode(jsonResponse.body).cast<Map<String, dynamic>>();
List<Profile> profile = jsonItems.map<Profile>((json) {
return MyMenu.fromJson(json);
}).toList();
return profile;
}
I always get this error message (attached on the image bellow):
What when wrong with my code ?
End up answering my question, I did this:
json.decode(jsonResponse.body)['data']['menus'].cast<Map<String, dynamic>>();
Don't know if there is any other perfect method to do this.
Your json had some syntax error as well.Please try this it if helps
import 'dart:convert';
void main() {
var jsonData= {
"status_code": 200,
"message": "Successfully get data user",
"data": {
"sec_user": {
"clientIp": "1.4.2.54",
"officeid": "N/A"
},
"username": "uname",
"name1": "",
"menus": [
{
"appl_id": "MTC",
"menu_caption": "Master",
"menu_path": "/master",
"submenus": [
{
"menu_caption": "Machine List",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/machine_list"
},
{
"menu_caption": "Sparepart Category",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/sparepart_category"
}
]
},
{
"appl_id": "MTC",
"menu_caption": "Master",
"menu_path": "/master",
"submenus": [
{
"menu_caption": "Machine List",
"note1": "master",
"sub_menu_id": "1",
"route_path": "/machine_list"
}
]
}
]
}
};
final jsonItems =
ApiResponse.fromJson(jsonData);
print(jsonItems.message);
}
class ApiResponse {
int statusCode;
String message;
Data data;
ApiResponse({this.statusCode, this.message, this.data});
ApiResponse.fromJson(Map<String, dynamic> json) {
statusCode = json['status_code'];
message = json['message'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status_code'] = this.statusCode;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class Data {
SecUser secUser;
String username;
String name1;
List<Menus> menus;
Data({this.secUser, this.username, this.name1, this.menus});
Data.fromJson(Map<String, dynamic> json) {
secUser = json['sec_user'] != null
? new SecUser.fromJson(json['sec_user'])
: null;
username = json['username'];
name1 = json['name1'];
if (json['menus'] != null) {
menus = new List<Menus>();
json['menus'].forEach((v) {
menus.add(new Menus.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.secUser != null) {
data['sec_user'] = this.secUser.toJson();
}
data['username'] = this.username;
data['name1'] = this.name1;
if (this.menus != null) {
data['menus'] = this.menus.map((v) => v.toJson()).toList();
}
return data;
}
}
class SecUser {
String clientIp;
String officeid;
SecUser({this.clientIp, this.officeid});
SecUser.fromJson(Map<String, dynamic> json) {
clientIp = json['clientIp'];
officeid = json['officeid'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['clientIp'] = this.clientIp;
data['officeid'] = this.officeid;
return data;
}
}
class Menus {
String applId;
String menuCaption;
String menuPath;
List<Submenus> submenus;
Menus({this.applId, this.menuCaption, this.menuPath, this.submenus});
Menus.fromJson(Map<String, dynamic> json) {
applId = json['appl_id'];
menuCaption = json['menu_caption'];
menuPath = json['menu_path'];
if (json['submenus'] != null) {
submenus = new List<Submenus>();
json['submenus'].forEach((v) {
submenus.add(new Submenus.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['appl_id'] = this.applId;
data['menu_caption'] = this.menuCaption;
data['menu_path'] = this.menuPath;
if (this.submenus != null) {
data['submenus'] = this.submenus.map((v) => v.toJson()).toList();
}
return data;
}
}
class Submenus {
String menuCaption;
String note1;
String subMenuId;
String routePath;
Submenus({this.menuCaption, this.note1, this.subMenuId, this.routePath});
Submenus.fromJson(Map<String, dynamic> json) {
menuCaption = json['menu_caption'];
note1 = json['note1'];
subMenuId = json['sub_menu_id'];
routePath = json['route_path'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['menu_caption'] = this.menuCaption;
data['note1'] = this.note1;
data['sub_menu_id'] = this.subMenuId;
data['route_path'] = this.routePath;
return data;
}
}