I am trying to parse a JSON string using a Boost Spirit object, storing a JSON object in recursive data structures:
Value <== [null, bool, long, double, std::string, Array, Object]; Array <== [Value, Value, Value, ...]; Object <== ["name1": Value, "name2": Value, ...];
And here is my code:
#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();
When compiling, I get an error:
Error C2440: 'initializing' : cannot convert from 'std::map<_Kty,_Ty>' to 'JsonValue'
Also, how to use JsonValue for JsonObject safely? When I try to do:
boost::get<JsonObject>(aval) = JsonObject();
This gets a runtime exception / fatal failure.
Any help is greatly appreciated.
EDIT:
Following @Nicol's advice, I came out with the following code:
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; };
I can work with JsonObject and JsonArray as easily as this:
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);
Just post it so everyone can benefit from it.