C++ 使用boostptree将JSON数组解析为std::string
我有这段代码,我需要将JSON数组解析为std::string,以便在应用程序中使用C++ 使用boostptree将JSON数组解析为std::string,c++,boost,C++,Boost,我有这段代码,我需要将JSON数组解析为std::string,以便在应用程序中使用 std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }] }"; ptree pt2; std::istringstream is(ss); read_json(is, pt2); std::string id = pt2.get<std::string>("i
std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }] }";
ptree pt2;
std::istringstream is(ss);
read_json(is, pt2);
std::string id = pt2.get<std::string>("id");
std::string num= pt2.get<std::string>("number");
std::string stuff = pt2.get<std::string>("stuff");
std::string ss=“{\'id\':\'123\',\'number\':\'456\',\'stuff\':[{\'name\':\'test\'}];
ptreept2;
std::istringstream是(ss);
读取json(is,pt2);
std::stringid=pt2.get(“id”);
std::string num=pt2.get(“number”);
std::string stuff=pt2.get(“stuff”);
需要的是像下面这样检索的“stuff”:string[{“name”:“test”}]
然而,上面的代码
stuff
只是返回空字符串。可能有什么问题数组被表示为具有多个“
键的子节点:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
int main() {
std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }, { \"name\" : \"some\" }, { \"name\" : \"stuffs\" }] }";
ptree pt;
std::istringstream is(ss);
read_json(is, pt);
std::cout << "id: " << pt.get<std::string>("id") << "\n";
std::cout << "number: " << pt.get<std::string>("number") << "\n";
for (auto& e : pt.get_child("stuff")) {
std::cout << "stuff name: " << e.second.get<std::string>("name") << "\n";
}
}
- JSON数组映射到节点。每个元素都是一个名称为空的子节点。如果节点同时具有命名和未命名的子节点,则无法将其映射到JSON表示
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
int main() {
std::string ss = "{ \"id\" : \"123\", \"number\" : \"456\", \"stuff\" : [{ \"name\" : \"test\" }, { \"name\" : \"some\" }, { \"name\" : \"stuffs\" }] }";
ptree pt;
std::istringstream is(ss);
read_json(is, pt);
std::cout << "id: " << pt.get<std::string>("id") << "\n";
std::cout << "number: " << pt.get<std::string>("number") << "\n";
for (auto& e : pt.get_child("stuff")) {
std::cout << "stuff name: " << e.second.get<std::string>("name") << "\n";
}
}
由于“stuff”
是一个数组,因此您可以迭代它的元素,即字典。然后可以迭代字典中的元素,这些元素是键值对:
for (const auto& dict : pt2.get_child("stuff")) {
for (const auto& kv : dict.second) {
std::cout << "key = " << kv.first << std::endl;
std::cout << "val = " << kv.second.get_value<std::string>() << std::endl;
}
}
for(const auto&dict:pt2.get_child(“stuff”)){
用于(常数自动和千伏:dict.second){
std::cout继续@sehe的回答,与@xkm提出的问题相关
有没有可能得到像“[{“name”:“some”},{“name”:“stuff”}”这样的结果
是的,你可以。只要用一个“未命名”键来处理它,这意味着这个键有空字符串
f、 g
#包括
#包括
#包括
使用boost::property_tree::ptree;
int main()
{
std::stringstream-ss;
ss[OT]:在这里使用原始字符串的好地方:ss=R“({“id”:“123”,“number”:“456”,“stuff”:[{“name”:“test”}]})”
。是否可以像“[{“name”:“some”},{“name”:“stuff”}]”那样获得它@xkm是的。编写json(some_stream,pt.get_child(“stuff”))
.Makesome_stream
astd::ostringstream
这样您就可以使用some_stream.str()
来获取text@sehe我希望在没有auto&e for循环的情况下执行此操作。我们能否以pt.get_child(“stuff”).name[0]的形式访问元素,并提供值测试。
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
using boost::property_tree::ptree;
int main()
{
std::stringstream ss;
ss << R"([{"a": 5}, {"a": 9}])";
ptree pt;
read_json(ss, pt);
for (auto& item : pt.get_child(""))
std::cout << "value is " << item.second.get<int>("a") << std::endl;
}