Answered by:
C++/CX template to JsonObject^

Question
-
Hi C++/CX experts,
Here's seeking expertise on C++/CX JSON serialization and templates in C++ /CX.
How do you convert template type to JSON object?
template <typename T>
ref class APIResponse sealed
{
//...internal:
property T Data
{
T get();
void set(T value);
}//...
}In the ConvertToJSON() Method:
//Please help
JsonObject^ jsonObject = ref new JsonObject();
auto var = safe_cast<T>(this->Data); // Compilation Error
jsonObject->Insert(L"data", var);
Please refer APIResponse.cpp in the following code snippet.
Here's the code snippet:
// APIError.h #pragma once using namespace Platform; using namespace Windows::Foundation::Collections; namespace PP { namespace Checkout { namespace Transaction { ref class APIError sealed { private: String^ name; String^ message; String^ displayMessage; String^ debugID; IMap<String^, Object^>^ details; public: APIError(); virtual ~APIError(void); property String^ Name { String^ get(); void set(String^ value); } property String^ DeveloperMessage { String^ get(); void set(String^ value); } property String^ DisplayMessage { String^ get(); void set(String^ value); } property String^ DebugID { String^ get(); void set(String^ value); } property IMap<String^, Object^>^ Details { IMap<String^, Object^>^ get(); void set(IMap<String^, Object^>^ value); } String^ ConvertToJSON(); }; } } } // APIError.cpp #include "pch.h" #include "APIError.h" #include "collection.h" using namespace Platform::Collections; using namespace Windows::Foundation::Collections; using namespace Windows::Data::Json; using namespace PP::Checkout::Transaction; APIError::APIError() { } APIError::~APIError(void) { } String^ APIError::Name::get() { return name; } void APIError::Name::set(String^ value) { name = value; } String^ APIError::DeveloperMessage::get() { return message; } void APIError::DeveloperMessage::set(String^ value) { message = value; } String^ APIError::DisplayMessage::get() { return displayMessage; } void APIError::DisplayMessage::set(String^ value) { displayMessage = value; } String^ APIError::DebugID::get() { return debugID; } void APIError::DebugID::set(String^ value) { debugID = value; } IMap<String^, Object^>^ APIError::Details::get() { return details; } void APIError::Details::set(IMap<String^, Object^>^ value) { details = value; } String^ APIError::ConvertToJSON() { String^ jsonString = ""; JsonObject^ jsonObject = ref new JsonObject(); jsonObject->Insert(L"name", JsonValue::CreateStringValue(this->Name)); jsonObject->Insert(L"developerMessage", JsonValue::CreateStringValue(this->DeveloperMessage)); jsonObject->Insert(L"displayMessage", JsonValue::CreateStringValue(this->DisplayMessage)); jsonObject->Insert(L"debugID", JsonValue::CreateStringValue(this->DebugID)); if(this->Details->Size > 0) { JsonObject^ jsonObjectDetails = ref new JsonObject(); JsonArray^ jsonArrayDetails = ref new JsonArray(); for each (IKeyValuePair<Platform::String^, Platform::Object^>^ pair in this->Details) { jsonObjectDetails->Insert(pair->Key, JsonValue::CreateStringValue(dynamic_cast<String^>(pair->Value))); jsonArrayDetails->Append(jsonObjectDetails); } jsonObject->Insert(L"details", jsonArrayDetails); } jsonString = jsonObject->Stringify(); return jsonString; } // APIResponse.h #pragma once #include "APIError.h" using namespace Platform; namespace PP { namespace Checkout { namespace Transaction { template <typename T> ref class APIResponse sealed { internal: String^ apiVersion; APIError^ error; property T Data { T get(); void set(T value); } public: APIResponse(void); virtual ~APIResponse(void); property String^ ApiVersion { String^ get(); void set(String^ value); } property APIError^ Error { APIError^ get(); void set(APIError^ value); } String^ ConvertToJSON(); }; } } } // APIResponse.cpp #include "pch.h" #include "APIResponse.h" #include "collection.h" using namespace Platform; using namespace Platform::Collections; using namespace Windows::Foundation::Collections; using namespace Windows::Data::Json; using namespace PP::Checkout::Transaction; APIResponse<class T>::APIResponse(void) { } template<> APIResponse<class T>::~APIResponse(void) { } String^ APIResponse<typename T>::ApiVersion::get() { return apiVersion; } void APIResponse<typename T>::ApiVersion::set(String^ value) { apiVersion = value; } APIError^ APIResponse<typename T>::Error::get() { return error; } void APIResponse<typename T>::Error::set(APIError^ value) { error = value; } String^ APIResponse<typename T>::ConvertToJSON() { String^ jsonString = ""; JsonObject^ jsonObject = ref new JsonObject(); jsonObject->Insert(L"apiVersion", JsonValue::CreateStringValue(this->ApiVersion)); //Please help //auto var = safe_cast<T>(this->Data); //jsonObject->Insert(L"data", var); JsonObject^ jsonObjectAPIError = ref new JsonObject(); jsonObjectAPIError->Insert(L"name", JsonValue::CreateStringValue(this->Error->Name)); jsonObjectAPIError->Insert(L"developerMessage", JsonValue::CreateStringValue(this->Error->DeveloperMessage)); jsonObjectAPIError->Insert(L"displayMessage", JsonValue::CreateStringValue(this->Error->DisplayMessage)); jsonObjectAPIError->Insert(L"debugID", JsonValue::CreateStringValue(this->Error->DebugID)); if(this->Error->Details->Size > 0) { JsonObject^ jsonObjectAPIErrorDetails = ref new JsonObject(); JsonArray^ jsonArrayAPIErrorDetails = ref new JsonArray(); for each (IKeyValuePair<Platform::String^, Platform::Object^>^ pair in this->Error->Details) { jsonObjectAPIErrorDetails->Insert(pair->Key, JsonValue::CreateStringValue(dynamic_cast<String^>(pair->Value))); jsonArrayAPIErrorDetails->Append(jsonObjectAPIErrorDetails); } jsonObjectAPIError->Insert(L"details", jsonArrayAPIErrorDetails); } jsonObject->Insert(L"error", jsonObjectAPIError); jsonString = jsonObject->Stringify(); return jsonString; }
- Edited by recherche Thursday, May 23, 2013 4:59 AM typo
Wednesday, May 22, 2013 12:14 PM
Answers
-
Hi,
I think you need to store the class type information. We can store it as string
http://stackoverflow.com/questions/1055452/c-get-name-of-type-in-template
And in the deserialization, we can create this temp class and fill it.
Best regards,
Jesse
Jesse Jiang
MSDN Community Support | Feedback to us
Develop and promote your apps in Windows Store
Please remember to mark the replies as answers if they help and unmark them if they provide no help.- Proposed as answer by Jesse Jiang Monday, May 27, 2013 2:08 AM
- Marked as answer by Jesse Jiang Tuesday, May 28, 2013 1:33 AM
Thursday, May 23, 2013 4:55 AM
All replies
-
Hi,
I think you need to store the class type information. We can store it as string
http://stackoverflow.com/questions/1055452/c-get-name-of-type-in-template
And in the deserialization, we can create this temp class and fill it.
Best regards,
Jesse
Jesse Jiang
MSDN Community Support | Feedback to us
Develop and promote your apps in Windows Store
Please remember to mark the replies as answers if they help and unmark them if they provide no help.- Proposed as answer by Jesse Jiang Monday, May 27, 2013 2:08 AM
- Marked as answer by Jesse Jiang Tuesday, May 28, 2013 1:33 AM
Thursday, May 23, 2013 4:55 AM -
Hi,
I think you need to store the class type information. We can store it as string
http://stackoverflow.com/questions/1055452/c-get-name-of-type-in-template
And in the deserialization, we can create this temp class and fill it.
Best regards,
Jesse
Jesse Jiang
MSDN Community Support | Feedback to us
Develop and promote your apps in Windows Store
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Thanks for the reply.Thursday, May 23, 2013 5:02 AM