source

Boost 속성 트리를 사용하여 어레이 읽기

manysource 2023. 2. 22. 22:36

Boost 속성 트리를 사용하여 어레이 읽기

다음과 같은 소수의 정수 배열 변수를 가진 JSON이 있습니다.

{"a": [8, 6, 2], "b": [2, 2, 1]}

다음과 같이 boost property_tree를 사용합니다.

std::stringstream ss;
boost::property_tree::ptree pt;

ss << "{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}";

boost::property_tree::read_json(ss, pt);
std::vector<int> a = pt.get<std::vector<int> >("a");

이것은 동작하지 않습니다.또한 제가 시도했던 int 포인터의 변화도 없습니다.속성 트리에서 어레이를 읽는 방법은 무엇입니까?

JSON 지원, 부스트 속성 트리로 얼룩이 있습니다.

속성 트리 데이터 집합이 입력되지 않았으며 어레이를 지원하지 않습니다.따라서 다음 JSON/속성 트리 매핑이 사용됩니다.

  • JSON 개체는 노드에 매핑됩니다.각 속성은 하위 노드입니다.
  • JSON 어레이는 노드에 매핑됩니다.각 요소는 이름이 비어 있는 하위 노드입니다.노드에 이름 있는 자노드와 이름 없는 자노드가 모두 있는 경우 JSON 표현에 매핑할 수 없습니다.
  • JSON 값은 값을 포함하는 노드에 매핑됩니다.그러나 모든 유형 정보는 손실됩니다. 숫자뿐만 아니라 리터럴 "null", "true" 및 "false"도 문자열 형식으로 매핑됩니다.
  • 하위 노드와 데이터를 모두 포함하는 속성 트리 노드를 매핑할 수 없습니다.

(문서 참조)

도우미 기능을 사용하여 어레이를 반복할 수 있습니다.

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using boost::property_tree::ptree;

template <typename T>
std::vector<T> as_vector(ptree const& pt, ptree::key_type const& key)
{
    std::vector<T> r;
    for (auto& item : pt.get_child(key))
        r.push_back(item.second.get_value<T>());
    return r;
}

int main()
{
    std::stringstream ss("{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}");

    ptree pt;
    read_json(ss, pt);

    for (auto i : as_vector<int>(pt, "a")) std::cout << i << ' ';
    std::cout << '\n';
    for (auto i : as_vector<int>(pt, "b")) std::cout << i << ' ';
}

라이브콜리루 보기출력:

8 6 2 
2 2 1

읽어주세요a다음과 같이 나타냅니다.

#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}

언급URL : https://stackoverflow.com/questions/23481262/using-boost-property-tree-to-read-int-array