Vie*_*iet 7 c++ json boost boost-spirit boost-variant
我正在尝试使用Boost Spirit商店JSON对象将JSON字符串解析为递归数据结构:
Value <== [null, bool, long, double, std::string, Array, Object];
Array <== [Value, Value, Value, ...];
Object <== ["name1": Value, "name2": Value, ...];
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#include <map>
#include <vector>
#include <string>
#include <boost/variant.hpp>
#include <boost/shared_array.hpp>
#include <boost/shared_ptr.hpp>
struct JsonNull {};
struct JsonValue;
typedef std::map<std::string, JsonValue *> JsonObject;
typedef std::vector<JsonValue *> JsonArray;
struct JsonValue : boost::variant<JsonNull, bool, long, double, std::string, JsonArray, JsonObject>
{
};
JsonValue aval = JsonObject();
Run Code Online (Sandbox Code Playgroud)
编译时我得到错误:
Error C2440: 'initializing' : cannot convert from 'std::map<_Kty,_Ty>' to 'JsonValue'
Run Code Online (Sandbox Code Playgroud)
而且,如何安全地将JsonValue转换为JsonObject?当我尝试做:
boost::get<JsonObject>(aval) = JsonObject();
Run Code Online (Sandbox Code Playgroud)
这会导致运行时异常/致命故障.
任何帮助是极大的赞赏.
按照@ Nicol的建议,我出来了以下代码:
struct JsonNull {};
struct JsonValue;
typedef std::map<std::string, JsonValue *> JsonObject;
typedef std::vector<JsonValue *> JsonArray;
typedef boost::variant<
JsonNull, bool, long, double, std::string,
JsonObject, JsonArray,
boost::recursive_wrapper<JsonValue>
> JsonDataValue;
struct JsonValue
{
JsonDataValue data;
};
Run Code Online (Sandbox Code Playgroud)
我可以像JsonObject和JsonArray一样简单:
JsonValue *pJsonVal = new JsonValue();
boost::get<JsonObject>(pCurrVal->data).insert(
std::pair<std::string, JsonValue *>("key", pJsonVal)
);
boost::get<JsonArray>(pCurrVal->data).push_back(pJsonVal);
Run Code Online (Sandbox Code Playgroud)
只是张贴,以便每个人都可以从中受益.
你必须使用递归包装器(你不应该从中派生boost::variant):
struct JsonValue;
typedef boost::variant</*types*/, boost::recursive_wrapper<JsonValue> > JsonDataValue;
struct JsonValue
{
JsonDataValue value;
};
Run Code Online (Sandbox Code Playgroud)
要使Boost.Spirit采用JsonValue,您需要编写其中一个Fusion适配器以使原始变体类型适应结构.
而且,如何安全地将JsonValue转换为JsonObject?当我尝试做:
这不是变体的工作方式.如果要将它们设置为值,只需将它们设置为任何其他值:
JsonValue val;
val.value = JsonValue();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2243 次 |
| 最近记录: |