I tried something like
rapidjson::Value& response = Doc[level1][level2][level3]...
for (auto m=response.MemberBegin();m!=response.MemberEnd();++m)
{
}
but it doesn't seem to work. Any ideas?
I tried something like
rapidjson::Value& response = Doc[level1][level2][level3]...
for (auto m=response.MemberBegin();m!=response.MemberEnd();++m)
{
}
but it doesn't seem to work. Any ideas?
Your json response class should be like for serialize and deserialize
class ResponseData {
List<Item> items;
ResponseData({
this.items,
});
factory ResponseData.fromJson(Map<String, dynamic> json) =>
ResponseData(
items: List<Item>.from(json["items"].map((x) => Item.fromJson(x))),
);
Map<String, dynamic> toJson() =>
{
"items": List<dynamic>.from(items.map((x) => x.toJson())),
};
}
class Item {
DateTime timestamp;
List<CarparkDatum> carparkData;
Item({
this.timestamp,
this.carparkData,
});
factory Item.fromJson(Map<String, dynamic> json) =>
Item(
timestamp: DateTime.parse(json["timestamp"]),
carparkData: List<CarparkDatum>.from(
json["carpark_data"].map((x) => CarparkDatum.fromJson(x))),
);
Map<String, dynamic> toJson() =>
{
"timestamp": timestamp.toIso8601String(),
"carpark_data": List<dynamic>.from(carparkData.map((x) => x.toJson())),
};
}
class CarparkDatum {
List<CarparkInfo> carparkInfo;
String carparkNumber;
DateTime updateDatetime;
CarparkDatum({
this.carparkInfo,
this.carparkNumber,
this.updateDatetime,
});
factory CarparkDatum.fromJson(Map<String, dynamic> json) =>
CarparkDatum(
carparkInfo: List<CarparkInfo>.from(
json["carpark_info"].map((x) => CarparkInfo.fromJson(x))),
carparkNumber: json["carpark_number"],
updateDatetime: DateTime.parse(json["update_datetime"]),
);
Map<String, dynamic> toJson() =>
{
"carpark_info": List<dynamic>.from(carparkInfo.map((x) => x.toJson())),
"carpark_number": carparkNumber,
"update_datetime": updateDatetime.toIso8601String(),
};
}
class CarparkInfo {
String totalLots;
LotType lotType;
String lotsAvailable;
CarparkInfo({
this.totalLots,
this.lotType,
this.lotsAvailable,
});
factory CarparkInfo.fromJson(Map<String, dynamic> json) =>
CarparkInfo(
totalLots: json["total_lots"],
lotType: lotTypeValues.map[json["lot_type"]],
lotsAvailable: json["lots_available"],
);
Map<String, dynamic> toJson() =>
{
"total_lots": totalLots,
"lot_type": lotTypeValues.reverse[lotType],
"lots_available": lotsAvailable,
};
}
enum LotType { C, H, Y, L }
final lotTypeValues = EnumValues({
"C": LotType.C,
"H": LotType.H,
"L": LotType.L,
"Y": LotType.Y
});
class EnumValues<T> {
Map<String, T> map;
Map<T, String> reverseMap;
EnumValues(this.map);
Map<T, String> get reverse {
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap;
}
}
You can always import the dart:convert package and use the json.decode function.
just use this website to convert your json response to dart class
I highly recommend to use json serializable for such things.
Here are good tutorial for network calling
If you have tried serializing or deserializing JSON payload, that should be a good start. However, if you are having trouble getting a good sense what your models would look like for complex one, you try pasting the JSON payload here.
models.dart
class Response {
List<Items> items;
Response({this.items});
Response.fromJson(Map<String, dynamic> json) {
if (json['items'] != null) {
items = new List<Items>();
json['items'].forEach((v) {
items.add(new Items.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items != null) {
data['items'] = this.items.map((v) => v.toJson()).toList();
}
return data;
}
}
class Items {
String timestamp;
List<CarparkData> carparkData;
Items({this.timestamp, this.carparkData});
Items.fromJson(Map<String, dynamic> json) {
timestamp = json['timestamp'];
if (json['carpark_data'] != null) {
carparkData = new List<CarparkData>();
json['carpark_data'].forEach((v) {
carparkData.add(new CarparkData.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['timestamp'] = this.timestamp;
if (this.carparkData != null) {
data['carpark_data'] = this.carparkData.map((v) => v.toJson()).toList();
}
return data;
}
}
class CarparkData {
List<CarparkInfo> carparkInfo;
String carparkNumber;
String updateDatetime;
CarparkData({this.carparkInfo, this.carparkNumber, this.updateDatetime});
CarparkData.fromJson(Map<String, dynamic> json) {
if (json['carpark_info'] != null) {
carparkInfo = new List<CarparkInfo>();
json['carpark_info'].forEach((v) {
carparkInfo.add(new CarparkInfo.fromJson(v));
});
}
carparkNumber = json['carpark_number'];
updateDatetime = json['update_datetime'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.carparkInfo != null) {
data['carpark_info'] = this.carparkInfo.map((v) => v.toJson()).toList();
}
data['carpark_number'] = this.carparkNumber;
data['update_datetime'] = this.updateDatetime;
return data;
}
}
class CarparkInfo {
String totalLots;
String lotType;
String lotsAvailable;
CarparkInfo({this.totalLots, this.lotType, this.lotsAvailable});
CarparkInfo.fromJson(Map<String, dynamic> json) {
totalLots = json['total_lots'];
lotType = json['lot_type'];
lotsAvailable = json['lots_available'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['total_lots'] = this.totalLots;
data['lot_type'] = this.lotType;
data['lots_available'] = this.lotsAvailable;
return data;
}
}
Although these models are already generated for you, it's best if you can check whether each field corresponds to their appropriate data type and field name.
There are different strategies in serializing and deserializing JSON payload. This is the most basic one, but should be fine for smaller projects with small teams. Flutter team created a well-written document to help you identify what suites your need.
Furthermore, these resources should help you out: