Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boostptree将JSON数组解析为std::string_C++_Boost - Fatal编程技术网

C++ 使用boostptree将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

我有这段代码,我需要将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>("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”))
.Make
some_stream
a
std::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;
}