1

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?

ZhenKai
  • 125
  • 2
  • 9
  • you can take a look at this dart package here https://pub.dev/packages/json_serializable – xion Mar 04 '20 at 12:10

4 Answers4

2

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;
  }
}
Navin Kumar
  • 3,393
  • 3
  • 21
  • 46
0

You can always import the dart:convert package and use the json.decode function.

0

just use this website to convert your json response to dart class

json to dart

I highly recommend to use json serializable for such things.

Here are good tutorial for network calling

fetch data from internet flutter

handling network like a pro

GJJ2019
  • 4,624
  • 3
  • 12
  • 22
0

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:

Joshua de Guzman
  • 2,063
  • 9
  • 24