in source/common/json/json_loader.cc [244:318]
void Field::buildRapidJsonDocument(const Field& field, rapidjson::Value& value,
rapidjson::Document::AllocatorType& allocator) {
switch (field.type_) {
case Type::Array: {
value.SetArray();
value.Reserve(field.value_.array_value_.size(), allocator);
for (const auto& element : field.value_.array_value_) {
switch (element->type_) {
case Type::Array:
case Type::Object: {
rapidjson::Value nested_value;
buildRapidJsonDocument(*element, nested_value, allocator);
value.PushBack(nested_value, allocator);
break;
}
case Type::Boolean:
value.PushBack(element->value_.boolean_value_, allocator);
break;
case Type::Double:
value.PushBack(element->value_.double_value_, allocator);
break;
case Type::Integer:
value.PushBack(element->value_.integer_value_, allocator);
break;
case Type::Null:
value.PushBack(rapidjson::Value(), allocator);
break;
case Type::String:
value.PushBack(rapidjson::StringRef(element->value_.string_value_.c_str()), allocator);
}
}
break;
}
case Type::Object: {
value.SetObject();
for (const auto& item : field.value_.object_value_) {
auto name = rapidjson::StringRef(item.first.c_str());
switch (item.second->type_) {
case Type::Array:
case Type::Object: {
rapidjson::Value nested_value;
buildRapidJsonDocument(*item.second, nested_value, allocator);
value.AddMember(name, nested_value, allocator);
break;
}
case Type::Boolean:
value.AddMember(name, item.second->value_.boolean_value_, allocator);
break;
case Type::Double:
value.AddMember(name, item.second->value_.double_value_, allocator);
break;
case Type::Integer:
value.AddMember(name, item.second->value_.integer_value_, allocator);
break;
case Type::Null:
value.AddMember(name, rapidjson::Value(), allocator);
break;
case Type::String:
value.AddMember(name, rapidjson::StringRef(item.second->value_.string_value_.c_str()),
allocator);
break;
}
}
break;
}
case Type::Null: {
value.SetNull();
break;
}
default:
NOT_REACHED_GCOVR_EXCL_LINE;
}
}