2014-05-05 17 views
20

Tôi có một số JSON với một số ít các biến mảng số nguyên, như vậy:Sử dụng cây tài sản tăng để đọc int mảng

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

Tôi muốn sử dụng tăng property_tree, ví dụ:

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"); 

Điều này không hoạt động, cũng không có bất kỳ biến thể nào trên một con trỏ int mà tôi đã thử. Làm thế nào tôi có thể đọc một mảng từ một cây bất động sản?

+0

thể trùng lặp của [Parsing JSON với cây bất động sản tăng] (http://stackoverflow.com/questions/13972252/parsing-json- with-boost-property-tree) –

+0

Câu trả lời cho câu hỏi đó không bao gồm trường hợp cụ thể của mảng, vì vậy tôi trân trọng không đồng ý. Ngẫu nhiên, câu trả lời cho câu hỏi này sắp tới. – Larry

+0

Nhưng bản thân câu hỏi có mã về xử lý các mảng và có một mảng trong dữ liệu ví dụ. Ông trích xuất các yếu tố bằng cách sử dụng một vòng lặp. –

Trả lời

20

Hỗ trợ JSON, là điểm nhấn với cây thuộc tính tăng.

Tập dữ liệu cây bất động sản không được nhập và không hỗ trợ mảng như vậy. Do đó, ánh xạ cây JSON/thuộc tính sau được sử dụng:

  • Đối tượng JSON được ánh xạ tới các nút. Mỗi thuộc tính là một nút con.
  • Mảng JSON được ánh xạ tới các nút. Mỗi phần tử là một nút con với một tên trống. Nếu một nút có cả hai nút con được đặt tên và không có tên, thì nó không thể được ánh xạ tới một biểu diễn JSON.
  • Giá trị JSON được ánh xạ tới các nút chứa giá trị. Tuy nhiên, tất cả các thông tin kiểu bị mất; các số, cũng như các chữ "null", "true" và "false" chỉ được ánh xạ tới dạng chuỗi của chúng.
  • Nút cây thuộc tính có chứa cả các nút con và dữ liệu không thể được ánh xạ.

(từ documentation)

Bạn có thể lặp lại các mảng với một hàm helper.

#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 << ' '; 
} 

Xem nó Live On Coliru. Output:

8 6 2 
2 2 1 
+0

Giải pháp tuyệt đẹp. Bất cứ ai có thể cung cấp mã ví dụ bằng cách sử dụng boost_foreach? - Tôi không thể sử dụng C++ 11 trong dự án của mình. –

+2

@ Tính độc đáo ở đây bạn đi: http://coliru.stacked-crooked.com/a/40082d6b5123dd8d – sehe

12

đọc danh sách a của bạn như sau:

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

Đó là thanh lịch với dấu ".' trong đường dẫn. +1 từ tôi – sehe

Các vấn đề liên quan