提升:解析 json 文件并获得 child

boost: parse json file and get a child

我正在尝试使用以下函数解析 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 库。 属性 Tree 不是 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"