boost:解析json文件并获得一个子文件



我正在尝试用以下函数解析JSON文件:

std::string getFieldFromJson_data(std::string json, std::string field)
{
std::stringstream jsonEncoded(json); // string to stream convertion
boost::property_tree::ptree root;
boost::property_tree::read_json(jsonEncoded, root);
if (root.empty())
return "";
return (root.get<std::string>(field));
}

当读取像

这样的元素时有效
device_json.data_device_id = stoi(getFieldFromJson_data(output, "data.device_id"));

我的JSON文件看起来像:

{
"data": {
"device_id": 67,
"place_open": {
"monday": [
"10:15","19:30"
]
}
}
}

我可以读取"data.device_id"的值,但当我试图读取"data.place_open.monday"我得到一个空字符串

使用JSON库。属性树不是一个JSON库。使用Boost JSON和JSON指针:

Live On Coliru

#include <boost/json.hpp>
#include <boost/json/src.hpp> // for header-only
#include <iostream>
#include <string_view>
auto getField(std::string_view json, std::string_view field) {
return boost::json::parse(json).at_pointer(field);
}
int main() {
auto output = R"({
"data": {
"device_id": 67,
"place_open": {
"monday": ["10:15", "19:30"]
}
}
})";
for (auto pointer : {
"/data",
"/data/device_id",
"/data/place_open/monday",
"/data/place_open/monday/0",
"/data/place_open/monday/1",
})
std::cout << pointer << " -> " << getField(output, pointer) << std::endl;
}

打印

/data -> {"device_id":67,"place_open":{"monday":["10:15","19:30"]}}
/data/device_id -> 67
/data/place_open/monday -> ["10:15","19:30"]
/data/place_open/monday/0 -> "10:15"
/data/place_open/monday/1 -> "19:30"

相关内容

最新更新