in common/json.cpp [55:136]
bool JSon::loadJsonFromFile(ifstream &fs, vector<KeyOpFieldsValuesTuple> &db_items)
{
nlohmann::json json_array;
try
{
fs >> json_array;
}
catch (const std::logic_error &e)
{
SWSS_LOG_ERROR("Unable to parse json from the input stream: %s", e.what());
return false;
}
catch (const std::bad_alloc &e)
{
SWSS_LOG_ERROR("Unable to parse json from the input stream: %s", e.what());
return false;
}
if (!json_array.is_array())
{
SWSS_LOG_ERROR("Root element must be an array.");
return false;
}
for (size_t i = 0; i < json_array.size(); i++)
{
auto &arr_item = json_array[i];
if (arr_item.is_object())
{
if (el_count != arr_item.size())
{
SWSS_LOG_ERROR("Child elements must have both key and op entry. %s",
arr_item.dump().c_str());
return false;
}
db_items.emplace_back();
auto &cur_db_item = db_items.back();
for (auto child_it = arr_item.begin(); child_it != arr_item.end(); child_it++)
{
auto cur_obj_key = child_it.key();
auto &cur_obj = child_it.value();
if (cur_obj.is_object())
{
kfvKey(cur_db_item) = cur_obj_key;
for (nlohmann::json::iterator cur_obj_it = cur_obj.begin(); cur_obj_it != cur_obj.end(); cur_obj_it++)
{
string field_str = cur_obj_it.key();
string value_str;
if ((*cur_obj_it).is_number())
value_str = to_string((*cur_obj_it).get<int>());
else if ((*cur_obj_it).is_string())
value_str = (*cur_obj_it).get<string>();
kfvFieldsValues(cur_db_item).emplace_back(field_str, value_str);
}
}
else
{
auto op = cur_obj.get<string>();
if (op != "SET" && op != "DEL")
{
SWSS_LOG_ERROR("Child elements' op field must be SET or DEL, but got %s, ignored", op.c_str());
db_items.pop_back();
break;
}
kfvOp(cur_db_item) = op;
}
}
}
else
{
SWSS_LOG_ERROR("Child elements must be objects. element:%s", arr_item.dump().c_str());
return false;
}
}
return true;
}