2012-09-12 38 views
55

Tôi là người mới đến c++. Cách dễ nhất để tuần tự hóa và deserialize dữ liệu của loại std::Map bằng cách sử dụng boost là gì. Tôi đã tìm thấy một số ví dụ với việc sử dụng PropertyTree nhưng chúng không rõ ràng đối với tôi.Nối tiếp và deserializing json với tăng

Trả lời

82

Lưu ý rằng property_tree diễn giải các khóa dưới dạng đường dẫn, ví dụ: đặt cặp "a.b" = "z" sẽ tạo một JSON "{" a ": {" b ":" z "}}, không phải là {" a.b ":" z "}. Nếu không, sử dụng property_tree là không đáng kể. Đây là một ví dụ nhỏ.

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

using boost::property_tree::ptree; 
using boost::property_tree::read_json; 
using boost::property_tree::write_json; 

void example() { 
    // Write json. 
    ptree pt; 
    pt.put ("foo", "bar"); 
    std::ostringstream buf; 
    write_json (buf, pt, false); 
    std::string json = buf.str(); // {"foo":"bar"} 

    // Read json. 
    ptree pt2; 
    std::istringstream is (json); 
    read_json (is, pt2); 
    std::string foo = pt2.get<std::string> ("foo"); 
} 

std::string map2json (const std::map<std::string, std::string>& map) { 
    ptree pt; 
    for (auto& entry: map) 
     pt.put (entry.first, entry.second); 
    std::ostringstream buf; 
    write_json (buf, pt, false); 
    return buf.str(); 
} 
+1

Tôi đã thử điều này (sử dụng Boost 1.57.0 nhiều lần hoặc ít hơn lần đầu tiên) và VS 2013 cho tôi cảnh báo C4512 (không thể tạo toán tử gán). Làm thế nào để giải quyết điều đó, ngoài việc ngăn chặn các cảnh báo? – Dabbler

+0

@Dabbler: Tôi không nhận được cảnh báo nào với GCC 4.9.1 ('g ++ -c -Wall -O2 -std = C++ 11 pt.cpp'). Không có VS. Cũng từ googling tôi muốn nói cảnh báo đến từ một nơi nào đó sâu hơn, bởi vì không có lớp nào được định nghĩa trong mã đã cho. Vì vậy, để trả lời câu hỏi của bạn, tôi nghĩ bạn nên cô lập các cảnh báo, kiểm tra xem nó được sản xuất bởi mã Boost trong property_tree, và nếu có, sau đó tìm kiếm các vấn đề Boost tương ứng, nộp một vấn đề mới nếu không ai đã làm nó được nêu ra. cf. http://www.boost.org/development/bugs.html – ArtemGr

+0

Câu trả lời hay. Làm thế nào về mảng? – ar2015

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