26#include <Ice/ObjectFactory.h>
43 const std::string& variantBaseTypeName,
53 ContainerTypePtr containerInfo =
59 nav =
nav.selectSingleNode(
"type");
62 std::string type =
nav.asString();
67 return ParseResult(
"Input might be in old format. Try importing.\n" +
85 json = parser.parsedJson->toJsonString(indenting);
91 const ContainerTypePtr& containerInfo,
95 if (containerInfo->subType)
102 "Unexpected JSON data type. Expected array at " +
103 nav.getData()->getLexerStartOffset().toLongString(),
106 for (JPathNavigator child : nav.select(
"*"))
109 CheckUserInput(child.getData(), containerInfo->subType, communicator);
122 "Unexpected JSON data type. Expected object at " +
123 nav.getData()->getLexerStartOffset().toLongString(),
126 for (JPathNavigator child : nav.select(
"*"))
129 CheckUserInput(child.getData(), containerInfo->subType, communicator);
141 nav.getData()->getLexerStartOffset().toLongString(),
151 nav.getData()->getLexerStartOffset().toLongString(),
157 nav.getData()->getLexerStartOffset().toLongString(),
163 nav.getData()->getLexerStartOffset().toLongString(),
169 nav.getData()->getLexerStartOffset().toLongString(),
175 nav.getData()->getLexerStartOffset().toLongString(),
181 nav.getData()->getLexerStartOffset().toLongString(),
189 Ice::ValueFactoryPtr factory =
190 communicator->getValueFactoryManager()->find(containerInfo->typeId);
191 SerializablePtr obj =
192 SerializablePtr::dynamicCast(factory->create(containerInfo->typeId));
193 static Ice::Current
c;
196 jsonObject->fromString(json->toJsonString(0));
199 obj->deserialize(jsonObject,
c);
201 catch (
const UserException& ex)
204 ": " + ex.reason +
". At " +
205 nav.getData()->getLexerStartOffset().toLongString(),
208 catch (LocalException& ex)
211 ex.getReason() +
". At " +
212 nav.getData()->getLexerStartOffset().toLongString(),
216 VariantDataPtr variant = VariantDataPtr::dynamicCast(obj);
220 "Cannot cast Variant. Expected: " + containerInfo->typeId +
221 ". Is: " + obj->ice_id() +
". At " +
222 nav.getData()->getLexerStartOffset().toLongString(),
231 const std::string& variantBaseTypeName,
235 return compressed->toJsonString(indenting);
240 const std::string& variantBaseTypeName)
249 ContainerTypePtr containerInfo =
251 return Compress(parser.parsedJson, containerInfo);
256 const std::string& variantBaseTypeName)
265 ContainerTypePtr containerInfo =
268 return decompressed->toJsonString(0);
273 const std::string& variantBaseTypeName)
278 variant->add(
"typeName", variantBaseTypeName);
311 o->add(
"variant", variant);
312 return o->toJsonString(0);
317 const ContainerTypePtr& containerInfo)
319 if (containerInfo->subType)
328 <<
nav.getData()->getLexerStartOffset().toLongString();
330 for (JPathNavigator child : nav.select(
"*"))
332 array->add(
Decompress(child.getData(), containerInfo->subType));
335 o->add(
"array", array);
336 o->add(
"type", JsonValue(containerInfo->typeId));
344 throw VariantJsonException(
"Wrong JSON data type. Expected object at ")
345 << nav.getData()->getLexerStartOffset().toLongString();
347 for (JPathNavigator child : nav.select(
"*"))
349 map->add(child.getKey(),
Decompress(child.getData(), containerInfo->subType));
353 o->add(
"type", JsonValue(containerInfo->typeId));
358 throw VariantJsonException(
"Unknown container type: ") << containerInfo->typeId;
364 variant->add(
"typeName", containerInfo->typeId);
365 variant->add(
"value", json->clone());
368 o->add(
"variant", variant);
375 const ContainerTypePtr& containerInfo)
377 if (containerInfo->subType)
382 for (JPathNavigator child : nav.select(
"array/*"))
384 a->add(
Compress(child.getData(), containerInfo->subType));
391 for (JPathNavigator child : nav.select(
"map/*"))
393 o->add(child.getKey(),
Compress(child.getData(), containerInfo->subType));
399 throw VariantJsonException(
"Unknown container type: ") << containerInfo->typeId;
404 std::string typeName = nav.selectSingleNode(
"variant/typeName").asString();
405 if (typeName != containerInfo->typeId)
407 throw VariantJsonException(
"typeName mismatch. expected: ")
408 << containerInfo->typeId <<
". is: " << typeName;
411 return nav.selectSingleNode(
"variant/value").getData();
static JsonValuePtr CreateRaw(Type type, const std::string &value)
static ParseResult Error(const std::string &error, ErrorType errorType)
static ParseResult Success()
static std::string getTypePrefix()
static std::string getTypePrefix()
static std::string getTypePrefix()
static ContainerTypePtr FromString(const std::string &typeStr)
static std::string Compress(const std::string &json, const std::string &variantBaseTypeName, int indenting=2)
static std::string Decompress(const std::string &json, const std::string &variantBaseTypeName)
static JsonDataPtr CompressToJson(const std::string &json, const std::string &variantBaseTypeName)
static ParseResult CheckUserInput(const std::string &json, const std::string &variantBaseTypeName, const Ice::CommunicatorPtr &communicator)
static ParseResult FormatUserInput(std::string &json, int indenting=2)
static std::string DecompressBasicVariant(const std::string &value, const std::string &variantBaseTypeName)
static int hashTypeName(const std::string &typeName)
Compute and return a hash value for a given type name.
::IceInternal::Handle<::Ice::Communicator > CommunicatorPtr
const VariantTypeId String
bool IsBasicType(VariantTypeId id)
const VariantTypeId Double
const VariantTypeId Float
double a(double t, double a0, double j)
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< JsonObject > JsonObjectPtr
std::shared_ptr< JsonData > JsonDataPtr
std::shared_ptr< JsonArray > JsonArrayPtr
IceInternal::Handle< JSONObject > JSONObjectPtr