我正在尝试使用boost::property_tree反序列化JSON数据。我已经设置了一个boost fusion序列来识别结构成员元素的类型,并使用一个函数来反序列化一个适当的JSON树。它过去对于包含普通数据类型的结构工作得很好。当我尝试对包含结构的结构应用相同的操作时,逻辑会失败并导致编译器错误。有人能看出我错在哪里吗?
#include <boost/fusion/include/sequence.hpp>
#include <boost/fusion/include/algorithm.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/fusion/include/is_sequence.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/type_traits.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
#include <type_traits>
#include <typeinfo>
#include <vector>
#include <list>
std::string type_name_to_recover = "";
template<typename type_t>
struct is_container : public std::false_type {};
template<typename type_t, typename allocator_t>
struct is_container < std::vector < type_t , allocator_t> > : public std::true_type {};
template<typename type_t, typename allocator_t>
struct is_container < std::list < type_t , allocator_t> > : public std::true_type {};
template <typename type_t>
struct simple_serializer;
template <typename sequence_t, typename index_t>
struct sequence_iterator
{
typedef typename boost::fusion::result_of::value_at<sequence_t, index_t>::type current_type_t;
typedef typename boost::mpl::next<index_t>::type next_index_t;
typedef boost::fusion::extension::struct_member_name<sequence_t, index_t::value> type_name_t;
static inline void read_json( boost::property_tree::ptree &pt, sequence_t& sequence)
{
type_name_to_recover = type_name_t::call();
simple_serializer<current_type_t>::read_json(pt, boost::fusion::at<index_t>(sequence));
type_name_to_recover = "";
sequence_iterator<sequence_t, next_index_t>::read_json(pt, sequence);
}
};
//tail of the sequence
template <typename sequence_t>
struct sequence_iterator<sequence_t, typename boost::fusion::result_of::size<sequence_t>::type >
{
static inline void read_json( boost::property_tree::ptree &pt, sequence_t& sequence) { }
};
template < typename sequence_t >
struct sequence_iterator_final : sequence_iterator < sequence_t, boost::mpl::int_< 0 > > {};
////////////////////////////////////////////////////////
//Plain old types serializer
////////////////////////////////////////////////////////
template <typename type_t>
struct serialize_pod
{
typedef serialize_pod<type_t> type;
static inline void read_json( boost::property_tree::ptree &pt, type_t& t)
{
auto v = pt.get_child(type_name_to_recover);
t = boost::lexical_cast<type_t>(v.data());
}
};
////////////////////////////////////////////////////////
//Sequence serializer
////////////////////////////////////////////////////////
template <typename sequence_t>
struct serialize_sequence
{
typedef serialize_sequence<sequence_t> type;
static inline void read_json( boost::property_tree::ptree &pt, sequence_t& sequence)
{
sequence_iterator_final<sequence_t>::read_json(pt, sequence);
}
};
////////////////////////////////////////////////////////
//Container serializer
////////////////////////////////////////////////////////
template <typename container_type_t>
struct serialize_container
{
typedef serialize_container<container_type_t> type;
template <typename type_t>
static void read_json( boost::property_tree::ptree &pt, std::vector<type_t> &t)
{
std::string temp_name = type_name_to_recover;
type_name_to_recover = "";
BOOST_FOREACH( boost::property_tree::ptree::value_type &tree_node_value, pt.get_child(temp_name) )
{
boost::property_tree::ptree subtree = (boost::property_tree::ptree) tree_node_value.second ;
if( subtree.empty() )
{
auto tree_node_y = subtree.data();
type_t type_val;
simple_serializer<type_t>::read_json(tree_node_y, type_val);
t.push_back(type_val);
}
else
{
auto tree_node_x = subtree.data();
type_t type_val;
simple_serializer<type_t>::read_json(tree_node_x, type_val);
t.push_back(type_val);
}
}
}
};
template <typename type_t>
struct resolve_serializer_type
{
typedef
typename boost::mpl::eval_if< boost::fusion::traits::is_sequence < type_t > , serialize_sequence < type_t > ,
typename boost::mpl::eval_if< is_container < type_t > , boost::mpl::identity < serialize_container < type_t > >,
serialize_pod < type_t > > >
::type type;
};
//
template <typename type_t>
struct simple_serializer : public resolve_serializer_type<type_t>::type { };
struct StructB
{
int s;
std::vector<int> vi_b;
};
struct StructA
{
int v;
std::vector<int> vi;
std::vector<StructB> lb;
};
BOOST_FUSION_ADAPT_STRUCT( StructB, (int , s) (std::vector<int>, vi_b) )
BOOST_FUSION_ADAPT_STRUCT( StructA, (int, v) (std::vector<int>, vi) (std::vector<StructB>, lb ) )
int main(int argc, char *argv[])
{
StructA sa_in;
std::string json_data = "{\"v\":20,\"vi\":[123,456,123],\"lb\":[{\"s\":999,\"vi_b\":[909,808]},{\"s\":888,\"vi_b\":[707]},{\"s\":777,\"vi_b\":[606,505,404,303]}]}";
std::stringstream is(json_data);
boost::property_tree::ptree pt;
boost::property_tree::json_parser::read_json(is, pt);
simple_serializer<StructA>::read_json( pt , sa_in);
}
错误消息:1
read_json函数似乎需要为包含其他结构的结构传入子树。如下所示更改容器序列化程序似乎可以解决问题。有人能确认解决方案是有效的吗?
////////////////////////////////////////////////////////
//Container serializer
////////////////////////////////////////////////////////
template <typename container_type_t>
struct serialize_container
{
typedef serialize_container<container_type_t> type;
template <typename type_t>
static void read_json( boost::property_tree::ptree &pt, std::vector<type_t> &t)
{
std::string temp_name = type_name_to_recover;
type_name_to_recover = "";
BOOST_FOREACH( boost::property_tree::ptree::value_type &tree_node_value, pt.get_child(temp_name) )
{
boost::property_tree::ptree subtree = (boost::property_tree::ptree) tree_node_value.second ;
if( subtree.empty() )
{
type_t type_val;
simple_serializer<type_t>::read_json(subtree, type_val);
t.push_back(type_val);
}
else
{
type_t type_val;
std::stringstream os;
boost::property_tree::write_json(os, subtree);
boost::property_tree::ptree pt_x;
boost::property_tree::json_parser::read_json(os, pt_x);
simple_serializer<type_t>::read_json(pt_x, type_val);
t.push_back(type_val);
}
}
}
};
作为我的应用程序的输入,我可能会得到一个JsonObject或它们的列表: 我可以使用作为两个输入的目标类型 然后评估根节点是阵列节点还是对象节点。 我寻求一种方法来定义我的自定义目标类型,例如
我对rust是完全陌生的,我正试图找出如何从URLendpoint反序列化任意JSON结构。 reqwest自述文件中的相应示例如下: 因此,在本例中,目标结构--即以字符串作为键、以字符串作为值的HashMap对象--显然是已知的。 但是,如果我不知道在请求endpoint上接收到的结构是什么样子呢?
问题内容: 我在 .NET for WinRT(C#)中 ,我想将JSON字符串反序列化为,然后将字典值稍后转换为实际类型。JSON字符串可以包含对象层次结构,我也希望在其中包含子对象。 这是应该能够处理的示例JSON: 我尝试使用 DataContractJsonSerializer 这样做: 实际上,这对于第一个级别是可行的,但是 “父母” 只是一个不能强制转换为的对象: 然后,我尝试使用 J
问题内容: 在这种情况下是否可能发生任何安全漏洞利用: str对象在哪里。该字符串是用户生成的,可能令人讨厌。假设我们的网络框架没有让我们失败,那是一个来自Python内置函数的真正诚实的str实例。 如果这样做很危险,我们可以对输入进行任何操作以使其安全吗? 我们当然 不 希望执行字符串中包含的任何东西。 对于这个问题,我认为不是必不可少的更大范围是,我们有成千上万个这样的环境: 在某些情况下嵌
我是一个新手,正在尝试编写一个简单的应用程序,从大学校中提取一些学校数据。组织。json数据如下所示: 我的结构如下所示: 当我运行代码时,我得到“json:无法将对象解组为[]main.SchoolStruct类型的Go值” 我正在使用gopencils库来提出我的请求,并成功地将其用于非常简单的请求。你知道我可能做错了什么吗?