mirror of
https://github.com/oatpp/oatpp.git
synced 2025-02-17 17:29:57 +08:00
Parser. JSON. Serialize Any.
This commit is contained in:
parent
0d951e3c56
commit
636a2133e9
@ -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())
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user