26 #include <Ice/ObjectFactory.h>
43 const std::string& variantBaseTypeName,
53 ContainerTypePtr containerInfo =
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 =
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();