// #pragma once #include "tariff_cfg.h" /// MemberType TariffConfiguration::IdentifyJsonMember(const char* member_name) { if (strcmp(member_name, "Currency") == 0) return MemberType::Currency; if (strcmp(member_name, "PaymentMethod") == 0) return MemberType::PaymentMethod; if (strcmp(member_name, "PaymentRate") == 0) return MemberType::PaymentRate; if (strcmp(member_name, "PaymentOption") == 0) return MemberType::PaymentOption; if (strcmp(member_name, "Duration") == 0) return MemberType::Duration; if (strcmp(member_name, "WeekDays") == 0) return MemberType::WeekDays; if (strcmp(member_name, "WeekDaysWorktime") == 0) return MemberType::WeekDaysWorkTime; if (strcmp(member_name, "SpecialDaysWorktime") == 0) return MemberType::SpecialDaysWorktime; if (strcmp(member_name, "SpecialDays") == 0) return MemberType::SpecialDays; if (strcmp(member_name, "PeriodYear") == 0) return MemberType::PeriodYear; else return MemberType::Unknown; } /// bool TariffConfiguration::ParseJson(TariffConfiguration* tariff_cfg, const char* json) { try { if (tariff_cfg == nullptr) { printf("TariffConfiguration pointer not set\n"); return false; } if (json == NULL) { printf("%s", "Input JSON string is NULL\n"); return false; } // Parse JSON to document Document document; document.Parse(json); // Return if parse error has been found ParseErrorCode err = document.GetParseError(); if (err != 0) { printf("%s %d (%s)\n", "Unable to parse JSON, error code:", err, GetParseError_En(err)); return false; } // Validate JSON, check if it's a JSON object printf("%s", "JSON parsing has been successful\n"); if (!document.IsObject()) { printf("%s", "Error: not a (valid) JSON object\n"); return false; } printf("%s", "Valid JSON object identified\n"); // Validate JSON, check configuration members if (!document.HasMember("Currency") || !document.HasMember("PaymentMethod") || !document.HasMember("PaymentOption") || !document.HasMember("PaymentRate") || !document.HasMember("Duration") || !document.HasMember("WeekDays") || !document.HasMember("SpecialDaysWorktime") || !document.HasMember("SpecialDays")) { printf("%s", "Error: not a valid configuration JSON\n"); return false; } printf("%s", "Valid JSON configuration identified\n"); TariffCurrency Currency; TariffDuration Duration; TariffPaymentMethod PaymentMethod; TariffPaymentRate PaymentOption; TariffSpecialDaysWorktime SpecialDaysWorktime; TariffSpecialDays SpecialDays; TariffWeekDays WeekDays; TariffWeekDaysWorktime WeekDaysWorktime; TariffPaymentOption VehicleType; TariffPeriodYear YearPeriod; MemberType mb_type; // Get all JSON object members // This code should run only once (to load JSON variables into memory) for (auto i = document.MemberBegin(); i != document.MemberEnd(); i++) { // Get name of all general members of JSON, don't print name if NULL const char* mb_name = i->name.GetString(); if (mb_name == NULL) continue; //printf(" -%s\n", mb_name); mb_type = IdentifyJsonMember(mb_name); // Get array for each JSON object member auto mb_array = document[mb_name].GetArray(); if (mb_array.Size() <= 0) break; //Iterate over provided array for (rapidjson::SizeType j = 0; j < mb_array.Size(); j++) { // Get all inner objects, don't print name if NULL auto inner_obj = mb_array[j].GetObject(); if (inner_obj.MemberCount() <= 0) break; // Iterate over inner object JSON members for (auto k = inner_obj.MemberBegin(); k != inner_obj.MemberEnd(); k++) { // Get inner object JSON member, don't print name if NULL const char* inner_obj_name = k->name.GetString(); if (inner_obj_name == NULL) { printf("Inner object name is NULL\n"); continue; } // Identify member type mb_type = IdentifyJsonMember(mb_name); // #pragma region Get_values switch (mb_type) { case MemberType::Unknown: break; case MemberType::Currency: if (strcmp(inner_obj_name, "pcu_id") == 0) Currency.pcu_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pcu_sign") == 0) Currency.pcu_sign = k->value.GetString(); else if (strcmp(inner_obj_name, "pcu_major") == 0) Currency.pcu_major = k->value.GetString(); else if (strcmp(inner_obj_name, "pcu_minor") == 0) Currency.pcu_minor = k->value.GetString(); else if (strcmp(inner_obj_name, "pcu_active") == 0) Currency.pcu_active = k->value.GetBool(); break; case MemberType::PaymentMethod: if (strcmp(inner_obj_name, "pme_id") == 0) PaymentMethod.pme_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pme_label") == 0) PaymentMethod.pme_label = k->value.GetString(); break; case MemberType::PaymentRate: if (strcmp(inner_obj_name, "pra_payment_option_id") == 0) PaymentOption.pra_payment_option_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pra_payment_unit_id") == 0) PaymentOption.pra_payment_unit_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentOption.pra_price = k->value.GetDouble(); break; case MemberType::PaymentOption: if (strcmp(inner_obj_name, "pop_id") == 0) VehicleType.pop_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pop_label") == 0) VehicleType.pop_label = k->value.GetString(); else if (strcmp(inner_obj_name, "pop_payment_method_id") == 0) VehicleType.pop_payment_method_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pop_day_end_time") == 0) VehicleType.pop_day_end_time = k->value.GetString(); else if (strcmp(inner_obj_name, "pop_day_night_end_time") == 0) VehicleType.pop_day_night_end_time = k->value.GetString(); else if (strcmp(inner_obj_name, "pop_price_night") == 0) VehicleType.pop_price_night = k->value.GetDouble(); break; case MemberType::Duration: if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pun_label") == 0) Duration.pun_label = k->value.GetString(); else if (strcmp(inner_obj_name, "pun_duration") == 0) Duration.pun_duration = k->value.GetDouble(); break; case MemberType::SpecialDaysWorktime: if (strcmp(inner_obj_name, "pedwt_id") == 0) SpecialDaysWorktime.pedwt_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pedwt_period_exc_day_id") == 0) SpecialDaysWorktime.pedwt_period_exc_day_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pedwt_time_from") == 0) SpecialDaysWorktime.pedwt_time_from = k->value.GetString(); else if (strcmp(inner_obj_name, "pedwt_time_to") == 0) SpecialDaysWorktime.pedwt_time_to = k->value.GetString(); else if (strcmp(inner_obj_name, "pedwt_price") == 0) SpecialDaysWorktime.pedwt_price = k->value.GetDouble(); break; case MemberType::WeekDays: if (strcmp(inner_obj_name, "pdiw_id") == 0) WeekDays.pdiw_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pdiw_label") == 0) WeekDays.pdiw_label = k->value.GetString(); else if (strcmp(inner_obj_name, "pdiw_index") == 0) WeekDays.pdiw_index = k->value.GetInt(); break; case MemberType::WeekDaysWorkTime: if (strcmp(inner_obj_name, "pwd_id") == 0) WeekDaysWorktime.pwd_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pwd_period_week_day_id") == 0) WeekDaysWorktime.pwd_period_day_in_week_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pwd_period_day_in_week_id") == 0) WeekDaysWorktime.pwd_period_week_day_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pwd_time_from") == 0) WeekDaysWorktime.pwd_time_from = k->value.GetString(); else if (strcmp(inner_obj_name, "pwd_time_to") == 0) WeekDaysWorktime.pwd_time_to = k->value.GetString(); break; case MemberType::SpecialDays: if (strcmp(inner_obj_name, "ped_id") == 0) SpecialDays.ped_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "ped_label") == 0) SpecialDays.ped_label = k->value.GetString(); else if (strcmp(inner_obj_name, "ped_date_start") == 0) SpecialDays.ped_date_start = k->value.GetString(); else if (strcmp(inner_obj_name, "ped_date_end") == 0) SpecialDays.ped_date_end = k->value.GetString(); else if (strcmp(inner_obj_name, "ped_period_special_day_id") == 0) SpecialDays.ped_period_special_day_id = k->value.GetInt(); break; case MemberType::PeriodYear: if (strcmp(inner_obj_name, "pye_id") == 0) YearPeriod.pye_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pye_label") == 0) YearPeriod.pye_label = k->value.GetString(); else if (strcmp(inner_obj_name, "pye_start_month") == 0) YearPeriod.pye_start_month = k->value.GetInt(); else if (strcmp(inner_obj_name, "pye_start_day") == 0) YearPeriod.pye_start_day = k->value.GetInt(); else if (strcmp(inner_obj_name, "pye_end_month") == 0) YearPeriod.pye_end_month = k->value.GetInt(); else if (strcmp(inner_obj_name, "pye_end_day") == 0) YearPeriod.pye_end_day = k->value.GetInt(); break; default: break; } // #pragma endregion } // Push to specific list depending on member type switch (mb_type) { case MemberType::Unknown: break; case MemberType::Currency: tariff_cfg->Currency.push_back(Currency); break; case MemberType::PaymentMethod: tariff_cfg->PaymentMethod.push_back(PaymentMethod); break; case MemberType::PaymentRate: tariff_cfg->PaymentRate.push_back(PaymentOption); break; case MemberType::PaymentOption: tariff_cfg->PaymentOption.push_back(VehicleType); break; case MemberType::Duration: tariff_cfg->Duration.push_back(Duration); break; case MemberType::SpecialDaysWorktime: tariff_cfg->SpecialDaysWorktime.push_back(SpecialDaysWorktime); break; case MemberType::WeekDays: tariff_cfg->WeekDays.push_back(WeekDays); break; case MemberType::WeekDaysWorkTime: tariff_cfg->WeekDaysWorktime.push_back(WeekDaysWorktime); break; case MemberType::SpecialDays: tariff_cfg->SpecialDays.push_back(SpecialDays); break; case MemberType::PeriodYear: tariff_cfg->YearPeriod.push_back(YearPeriod); break; default: break; } } } return true; } catch (...) { printf("%s\n", "General exception has occurred while parsing JSON\n"); return false; } }