JSON for Modern C++
https://github.com/nlohmann/json
解析复杂结构,不好意忘了贴具体的json数据了,大家看解析过程应该可以猜到。
#include <nlohmann/json.hpp>
// for convenience
using json = nlohmann::json;
std::string media_config_string = std::string(*json_param);
json media_config = json::parse(media_config_string);
std::vector<erizo::RtpMap> rtp_mappings;
if (media_config.find("rtpMappings") != media_config.end()) {
json rtp_map_json = media_config["rtpMappings"];
for (json::iterator it = rtp_map_json.begin(); it != rtp_map_json.end(); ++it) {
erizo::RtpMap rtp_map;
if (it.value()["payloadType"].is_number()) {
rtp_map.payload_type = it.value()["payloadType"];
} else {
continue;
}
if (it.value()["encodingName"].is_string()) {
rtp_map.encoding_name = it.value()["encodingName"];
} else {
continue;
}
if (it.value()["mediaType"].is_string()) {
if (it.value()["mediaType"] == "video") {
rtp_map.media_type = erizo::VIDEO_TYPE;
} else if (it.value()["mediaType"] == "audio") {
rtp_map.media_type = erizo::AUDIO_TYPE;
} else {
continue;
}
} else {
continue;
}
if (it.value()["clockRate"].is_number()) {
rtp_map.clock_rate = it.value()["clockRate"];
}
if (rtp_map.media_type == erizo::AUDIO_TYPE) {
if (it.value()["channels"].is_number()) {
rtp_map.channels = it.value()["channels"];
}
}
if (it.value()["formatParameters"].is_object()) {
json format_params_json = it.value()["formatParameters"];
for (json::iterator params_it = format_params_json.begin();
params_it != format_params_json.end(); ++params_it) {
std::string value = params_it.value();
std::string key = params_it.key();
rtp_map.format_parameters.insert(rtp_map.format_parameters.begin(),
std::pair<std::string, std::string> (key, value));
}
}
if (it.value()["feedbackTypes"].is_array()) {
json feedback_types_json = it.value()["feedbackTypes"];
for (json::iterator feedback_it = feedback_types_json.begin();
feedback_it != feedback_types_json.end(); ++feedback_it) {
rtp_map.feedback_types.push_back(*feedback_it);
}
}
rtp_mappings.push_back(rtp_map);
}
}