Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 如何使用C++;_C++_Json_Boost - Fatal编程技术网

C++ 如何使用C++;

C++ 如何使用C++;,c++,json,boost,C++,Json,Boost,我知道如何解析C++中看起来“正常”的JSON数据。通常,我使用boost::property\u tree和read\u json方法来实现这一点。看起来可能是这样的: BOOST_FOREAH(ptree::value_type &v, pt.get_child("rows"){ vec.push_back(v.second.get<std::string>("key")); } 但是,我得到的Neo4j结果集如下所示: { "columns":{...

我知道如何解析
C++
中看起来“正常”的
JSON
数据。通常,我使用
boost::property\u tree
read\u json
方法来实现这一点。看起来可能是这样的:

BOOST_FOREAH(ptree::value_type &v, pt.get_child("rows"){
    vec.push_back(v.second.get<std::string>("key"));
}
但是,我得到的
Neo4j
结果集如下所示:

{
    "columns":{...},
    "data":[[["object 1"]], [["object 2"]], [["object 3"]]]
}
我很感兴趣,想解析
“数据”
节点。我试着这样做:

BOOST_FOREAH(ptree::value_type &v, pt.get_child("data"){
    vec.push_back(v.second.data());
}

但这是行不通的。我没有得到错误,但是我的vector
vec
仍然是空的,或者更准确地说,它填充了空值。因此,当我遍历这个
vec
时,我看到了许多元素,但它们没有任何值。然而,我希望有值
“对象1”
“对象2”
“对象3”
,解决方案如下所示:

using boost::property::ptree;
ptree pt;
//... populate ptree pt with data from some source
BOOST_FOREACH(ptree::value_type &v, pt.get_child('data')){
    ptree subtree1 = v.second;
    BOOST_FOREACH(ptree::value_type &vs, subtree1){
        ptree subtree2 = vs.second;
        BOOST_FOREACH(ptree::value_type &vs2, subtree2){
            do_something(vs2.second.data());
        }
    }
}
此代码使解析此类JSON结构成为可能:

{
 "data":[[["object 1"]], [["object 2"]], [["object 3"]]]
}

因此,与一些人所说的相反,实际上,没有必要使用其他第三方库。只需使用
boost
,您就完成了。

这是我如何完成的一个示例。您必须提前了解JSON结构

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

boost::property_tree::ptree pt, sub_pt;
std::string json_str, key, sub_key;
std::stringstream ss;
int value = 0, bus_num = 0;

json_str = "{\"arduino_1\": {\"bus_1\": 17425,\"bus_2\": 1025,\"bus_3\": 0,\"bus_4\": 0,\"bus_5\": 0,\"bus_6\": 0,\"bus_7\": 0,\"bus_8\": 0}}";


ss << json_str; // put string into stringstream
boost::property_tree::read_json(ss, pt);    // put stringstream into property tree
for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++)
{
    // get data
    key = boost::lexical_cast <std::string>(iter->first.data());
    sub_pt = iter->second;

    // iterate over subtree
    for (boost::property_tree::ptree::iterator sub_iter = sub_pt.begin(); sub_iter != sub_pt.end(); sub_iter++)
    {
        // get data
        sub_key = boost::lexical_cast <std::string>(sub_iter->first.data());
        value = boost::lexical_cast <int>(sub_iter->second.data());
    }
}
#包括
#包括
#包括
boost::property_tree::ptree pt,sub_pt;
字符串json_str,key,sub_key;
std::stringstream-ss;
int值=0,总线数=0;
json_str=“{\'arduino_1\”:{\'bus_1\':17425,\'bus_2\':1025,\'bus_3\':0,\'bus_4\':0,\'bus_5\':0,\'bus_6\':0,\'bus_7\':0,\'bus_8\':0}”;
ss first.data());
sub_pt=国际热核实验堆->秒;
//遍历子树
for(boost::property_tree::ptree::iterator sub_iter=sub_pt.begin();sub_iter!=sub_pt.end();sub_iter++)
{
//获取数据
sub_key=boost::词法转换(sub_iter->first.data());
value=boost::词法转换(sub_iter->second.data());
}
}

,json_spirit,仅举两个库的名称。这些库看起来很有希望,但您100%确定它们会解析我的json文件吗?@Jacobian如果库声称它支持解析标准json,那么它将解析标准json,否则它就是有缺陷的。或者你的问题不清楚,答案就在JSON后端特有的约20行文档中。这也是一个非常常见的问题,因此快速搜索+
array
应该可以在几秒钟内为您提供有用的答案。最后,我想提醒大家,Boost没有JSON或XML库。它确实有一个属性树库。人们经常会混淆这两种代码,而且会被这两种代码的残骸弄得乱七八糟。我希望能简化一下。因为,复制粘贴技术看起来相当技术化。通常不需要第三方库。虽然你很幸运,但这能满足你的需求。如果您需要格式化正确的JSON编号,祝您好运。这就是为什么evangelise Boost属性树作为JSON库更糟糕的原因。
#include <boost/lexical_cast.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

boost::property_tree::ptree pt, sub_pt;
std::string json_str, key, sub_key;
std::stringstream ss;
int value = 0, bus_num = 0;

json_str = "{\"arduino_1\": {\"bus_1\": 17425,\"bus_2\": 1025,\"bus_3\": 0,\"bus_4\": 0,\"bus_5\": 0,\"bus_6\": 0,\"bus_7\": 0,\"bus_8\": 0}}";


ss << json_str; // put string into stringstream
boost::property_tree::read_json(ss, pt);    // put stringstream into property tree
for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++)
{
    // get data
    key = boost::lexical_cast <std::string>(iter->first.data());
    sub_pt = iter->second;

    // iterate over subtree
    for (boost::property_tree::ptree::iterator sub_iter = sub_pt.begin(); sub_iter != sub_pt.end(); sub_iter++)
    {
        // get data
        sub_key = boost::lexical_cast <std::string>(sub_iter->first.data());
        value = boost::lexical_cast <int>(sub_iter->second.data());
    }
}