Parser. JSON. Serialize Any.

This commit is contained in:
lganzzzo 2020-04-25 03:33:59 +03:00
parent 0d951e3c56
commit 636a2133e9
6 changed files with 74 additions and 13 deletions

View File

@ -36,9 +36,9 @@ Any::Any()
Any::Any(std::nullptr_t) : Any() {}
Any::Any(const AbstractObjectWrapper& polymorph)
: PolymorphicWrapper(std::make_shared<AnyHandle>(polymorph.getPtr(), polymorph.valueType), __class::Any::getType())
{}
//Any::Any(const AbstractObjectWrapper& polymorph)
// : PolymorphicWrapper(std::make_shared<AnyHandle>(polymorph.getPtr(), polymorph.valueType), __class::Any::getType())
//{}
Any::Any(const Any& other)
: PolymorphicWrapper(std::make_shared<AnyHandle>(other.m_ptr->ptr, other.m_ptr->type), __class::Any::getType())

View File

@ -68,11 +68,19 @@ public:
Any();
Any(std::nullptr_t);
Any(const AbstractObjectWrapper& polymorph);
Any(const Any& other);
Any(Any&& other);
Any(const std::shared_ptr<base::Countable>& ptr, const Type* const type)
: PolymorphicWrapper(std::make_shared<AnyHandle>(ptr, type), __class::Any::getType())
{}
template<class T>
Any(const PolymorphicWrapper<T>& polymorph)
: PolymorphicWrapper(std::make_shared<AnyHandle>(polymorph.getPtr(), polymorph.valueType), __class::Any::getType())
{}
void store(const AbstractObjectWrapper& polymorph);
const Type* const getStoredType();

View File

@ -30,6 +30,7 @@
#include "./Primitive.hpp"
#include "./ListMap.hpp"
#include "./List.hpp"
#include "./Any.hpp"
#include "oatpp/core/base/memory/ObjectPool.hpp"
#include "oatpp/core/base/Countable.hpp"
@ -73,6 +74,7 @@ namespace __class {
*/
class Object : public oatpp::base::Countable {
public:
typedef oatpp::data::mapping::type::Any Any;
typedef oatpp::data::mapping::type::String String;
typedef oatpp::data::mapping::type::Int8 Int8;
typedef oatpp::data::mapping::type::UInt8 UInt8;

View File

@ -25,6 +25,7 @@
#include "Serializer.hpp"
#include "oatpp/parser/json/Utils.hpp"
#include "oatpp/core/data/mapping/type/Any.hpp"
namespace oatpp { namespace parser { namespace json { namespace mapping {
@ -35,6 +36,7 @@ Serializer::Serializer(const std::shared_ptr<Config>& config)
m_methods.resize(data::mapping::type::ClassId::getClassCount(), nullptr);
setSerializerMethod(oatpp::data::mapping::type::__class::String::CLASS_ID, &Serializer::serializeString);
setSerializerMethod(oatpp::data::mapping::type::__class::Any::CLASS_ID, &Serializer::serializeAny);
setSerializerMethod(oatpp::data::mapping::type::__class::Int8::CLASS_ID, &Serializer::serializePrimitive<oatpp::Int8>);
setSerializerMethod(oatpp::data::mapping::type::__class::UInt8::CLASS_ID, &Serializer::serializePrimitive<oatpp::UInt8>);
@ -92,6 +94,21 @@ void Serializer::serializeString(Serializer* serializer,
}
void Serializer::serializeAny(Serializer* serializer,
data::stream::ConsistentOutputStream* stream,
const data::mapping::type::AbstractObjectWrapper& polymorph)
{
if(!polymorph) {
stream->writeSimple("null", 4);
return;
}
auto anyHandle = static_cast<data::mapping::type::AnyHandle*>(polymorph.get());
serializer->serialize(stream, data::mapping::type::AbstractObjectWrapper(anyHandle->ptr, anyHandle->type));
}
void Serializer::serializeList(Serializer* serializer,
data::stream::ConsistentOutputStream* stream,
const data::mapping::type::AbstractObjectWrapper& polymorph)

View File

@ -134,6 +134,10 @@ private:
data::stream::ConsistentOutputStream* stream,
const data::mapping::type::AbstractObjectWrapper& polymorph);
static void serializeAny(Serializer* serializer,
data::stream::ConsistentOutputStream* stream,
const data::mapping::type::AbstractObjectWrapper& polymorph);
static void serializeList(Serializer* serializer,
data::stream::ConsistentOutputStream* stream,
const data::mapping::type::AbstractObjectWrapper& polymorph);

View File

@ -38,11 +38,9 @@ namespace {
#include OATPP_CODEGEN_BEGIN(DTO)
typedef oatpp::data::mapping::type::Object DTO;
class TestChild : public oatpp::Object {
class TestChild : public DTO {
DTO_INIT(TestChild, DTO)
DTO_INIT(TestChild, Object)
static ObjectWrapper createShared(const char* name, const char* secondName){
auto result = createShared();
@ -56,9 +54,9 @@ class TestChild : public DTO {
};
class Test : public DTO {
class Test : public oatpp::Object {
DTO_INIT(Test, DTO)
DTO_INIT(Test, Object)
DTO_FIELD(String, field_string, "string-field-name-qualifier");
DTO_FIELD(Int32, field_int32, "int32-field-name-qualifier");
@ -81,6 +79,23 @@ class Test : public DTO {
DTO_FIELD(TestChild::ObjectWrapper, child1);
};
class TestAny : public oatpp::Object {
DTO_INIT(TestAny, Object)
DTO_FIELD(List<Any>::ObjectWrapper, anyList) = List<Any>::createShared();
};
class TestAnyNested : public oatpp::Object {
DTO_INIT(TestAnyNested, Object)
DTO_FIELD(String, f1) = "Field_1";
DTO_FIELD(String, f2) = "Field_2";
};
#include OATPP_CODEGEN_END(DTO)
@ -89,6 +104,7 @@ class Test : public DTO {
void DTOMapperTest::onRun(){
auto mapper = oatpp::parser::json::mapping::ObjectMapper::createShared();
mapper->getSerializer()->getConfig()->useBeautifier = true;
Test::ObjectWrapper test1 = Test::createShared();
@ -137,9 +153,9 @@ void DTOMapperTest::onRun(){
test1->field_list_object->pushBack(TestChild::createShared("child", "2"));
test1->field_list_object->pushBack(TestChild::createShared("child", "3"));
auto l1 = DTO::List<TestChild::ObjectWrapper>::createShared();
auto l2 = DTO::List<TestChild::ObjectWrapper>::createShared();
auto l3 = DTO::List<TestChild::ObjectWrapper>::createShared();
auto l1 = oatpp::List<TestChild::ObjectWrapper>::createShared();
auto l2 = oatpp::List<TestChild::ObjectWrapper>::createShared();
auto l3 = oatpp::List<TestChild::ObjectWrapper>::createShared();
l1->pushBack(TestChild::createShared("list_1", "item_1"));
l1->pushBack(TestChild::createShared("list_1", "item_2"));
@ -190,6 +206,20 @@ void DTOMapperTest::onRun(){
OATPP_LOGV(TAG, "json='%s'", (const char*) result->getData());
{
auto obj = TestAny::createShared();
obj->anyList->pushBack(oatpp::String("Hello Any!!!"));
obj->anyList->pushBack(oatpp::Int32(32));
obj->anyList->pushBack(oatpp::Int64(64));
obj->anyList->pushBack(oatpp::Float64(0.64));
obj->anyList->pushBack(oatpp::Float64(0.64));
obj->anyList->pushBack(TestAnyNested::createShared());
auto json = mapper->writeToString(obj);
OATPP_LOGV(TAG, "any json='%s'", (const char*) json->getData());
}
}
#include OATPP_CODEGEN_END(DTO)