Skip to content
Snippets Groups Projects
Commit 1821c082 authored by Evgeny Lavrik's avatar Evgeny Lavrik
Browse files

Update jsoncons

Add convenience methods to convert, read and write json objects to files
parent 64ccb862
No related branches found
No related tags found
No related merge requests found
...@@ -184,8 +184,8 @@ class ObjectStore : public TGenBase::BaseClassVersioned<ObjectStore> ...@@ -184,8 +184,8 @@ class ObjectStore : public TGenBase::BaseClassVersioned<ObjectStore>
} // namespace TGenBase } // namespace TGenBase
// JsonCons extension for this class // JsonCons extension for this class
JSONCONS_PROPERTY_TRAITS_DECL(TGenBase::ObjectStore::TestObject, Get, Set, Id, Param, CreatedAt);
JSON_FOR(TGenBase::ObjectStore); JSON_FOR(TGenBase::ObjectStore);
JSONCONS_N_GETTER_SETTER_TRAITS(TGenBase::ObjectStore::TestObject, Get, Set, 0, Id, Param, CreatedAt);
#endif /* !OBJECTSTORE_H */ #endif /* !OBJECTSTORE_H */
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#pragma link off all functions; #pragma link off all functions;
#pragma link off all namespaces; #pragma link off all namespaces;
#pragma link C++ class TimeStamp+; #pragma link C++ class TimeStamp+;
#pragma link C++ class TGenBase::Streamer+; #pragma link C++ class TGenBase::Streamer+;
#pragma link C++ class TGenBase::Client+; #pragma link C++ class TGenBase::Client+;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <cxxabi.h> #include <cxxabi.h>
#include <typeinfo> #include <typeinfo>
#include <fstream>
template< class T > template< class T >
...@@ -22,6 +23,10 @@ std::unique_ptr<T> copy_unique(const std::unique_ptr<T>& source) ...@@ -22,6 +23,10 @@ std::unique_ptr<T> copy_unique(const std::unique_ptr<T>& source)
#define JSON_FOR(CLS) \ #define JSON_FOR(CLS) \
namespace jsoncons \ namespace jsoncons \
{ \ { \
template <> \
struct is_json_type_traits_declared<CLS> : public std::true_type \
{}; \
\
template<class Json> \ template<class Json> \
struct json_type_traits<Json, CLS> \ struct json_type_traits<Json, CLS> \
{ \ { \
...@@ -74,29 +79,88 @@ static std::string ClassName() { ...@@ -74,29 +79,88 @@ static std::string ClassName() {
return result.substr(idx + 2, result.size() - idx - 2); return result.substr(idx + 2, result.size() - idx - 2);
} }
template <class T> template <class T>
static inline T* FromJson(jsoncons::ojson json) { static std::vector<T> FromJson(jsoncons::ojson json) {
if (!json.is_object()) return nullptr; // if (!jsoncons::is_json_type_traits_declared<T>::value) {
return new T(json.as<T>()); // std::cout << "TGenBase::FromJson<T>: jsoncons type traits are not defined for your type <T>" << std::endl;
// return;
// }
if (json.is_object()) return { json.as<T>() };
if (json.is_array()) return json.as<std::vector<T>>();
std::cout << "TGenBase::FromJson<T>: `json` is not an object or array" << std::endl;
return {};
} }
template <class T> template <class T>
static T* FromJsonString(std::string jsonString) { static std::vector<T> FromJsonString(std::string jsonString) {
if (!jsonString.size()) if (!jsonString.size())
return nullptr; return {};
try { try {
return FromJson<T>(jsoncons::ojson::parse(jsonString)); jsoncons::ojson json = jsoncons::ojson::parse(jsonString);
return FromJson<T>(json);
} }
catch (const jsoncons::ser_error& e) { catch (const jsoncons::ser_error& e) {
std::cout << "TGenBase::FromJsonString" << std::endl; std::cout << "TGenBase::FromJsonString<T> parsing error" << std::endl;
std::cout << e.what() << std::endl; std::cout << e.what() << std::endl;
return nullptr; return {};
} }
}
} // namespace TGenBase template <class T>
static std::vector<T> FromJsonFile(std::string fileName) {
std::ifstream is(fileName.c_str());
if (!is.good()) {
std::cout << "TGenBase::FromJsonFile<T>: error reading from json file " << fileName << std::endl;
return {};
}
std::stringstream contents;
contents << is.rdbuf();
return FromJsonString<T>(contents.str());
}
template <class T>
static jsoncons::ojson ToJson(T value) {
// if (!jsoncons::is_json_type_traits_declared<T>::value) {
// std::cout << "TGenBase::ToJson<T>: jsoncons type traits are not defined for your type <T>" << std::endl;
// return;
// }
return value;
} }
template <class T>
static std::string ToJsonString(T value, bool pretty = true) {
std::ostringstream s;
if (pretty) {
s << jsoncons::pretty_print(ToJson(value));
} else {
s << ToJson(value);
}
return s.str();
}
template <class T>
static void ToJsonFile(std::string fileName, T value, bool pretty = true) {
std::ofstream os(fileName.c_str());
if (!os.good()) {
std::cout << "TGenBase::ToJsonFile<T>: error writing to json file " << fileName << std::endl;
return;
}
if (pretty) {
os << jsoncons::pretty_print(ToJson(value));
} else {
os << ToJson(value);
}
}
} // namespace TGenBase
#endif /* !TGENBASEUTILS_H */ #endif /* !TGENBASEUTILS_H */
set(JSONCONS_VERSION 1d81dc242a0ad29123c4fff4470d5d5e5d461b4a) # hash is tag 0.158.0 set(JSONCONS_VERSION 06d10fbca36b049fc7592cce0e80e91c0db4bce9) # hash is tag v0.163.3
set(JSONCONS_SRC_URL "https://github.com/danielaparker/jsoncons.git") set(JSONCONS_SRC_URL "https://github.com/danielaparker/jsoncons.git")
set(JSONCONS_DESTDIR "${CMAKE_BINARY_DIR}/external/JSONCONS-prefix") set(JSONCONS_DESTDIR "${CMAKE_BINARY_DIR}/external/JSONCONS-prefix")
set(JSONCONS_LIBNAME "${CMAKE_SHARED_LIBRARY_PREFIX}jsoncons${CMAKE_SHARED_LIBRARY_SUFFIX}") set(JSONCONS_LIBNAME "${CMAKE_SHARED_LIBRARY_PREFIX}jsoncons${CMAKE_SHARED_LIBRARY_SUFFIX}")
...@@ -28,6 +28,7 @@ ExternalProject_Add(JSONCONS ...@@ -28,6 +28,7 @@ ExternalProject_Add(JSONCONS
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR} -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
-DJSONCONS_BUILD_TESTS:BOOL=OFF
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment