// // JsonRead.h // cocos2d_libs // // Created by 徐俊杰 on 2020/6/5. // #ifndef JsonRead_h #define JsonRead_h #include "rparticle/Macros/RParticleMacros.h" #include "json/rapidjson.h" #include "json/document.h" #include "rparticle/Serialize/TransferFunctions/TransferBase.h" #include "rparticle/Serialize/TransferFunctions/JsonSerializeTraits.h" #include NS_RRP_BEGIN class JsonRead : public TransferBase { public: JsonRead(const std::string &content); bool IsReading () { return true; } template void Transfer (T& data, const char* name, int metaFlag = 0); template void TransferDeepData (T& data); template void TransferBasicData (T& data); template void TransferSTLStyleArray (T& data, int metaFlag = 0); private: rapidjson::Document document; std::string currentKey; std::stack valueStack; }; template void JsonRead::Transfer (T& data, const char* _name, int metaFlag) { currentKey = _name; JsonSerializeTraits::Transfer (data, *this); } template inline void JsonRead::TransferDeepData (T& data) { rapidjson::Value* value = valueStack.top(); valueStack.push(&((*value)[currentKey.c_str()])); data.Transfer (*this); valueStack.pop(); } template<> inline void JsonRead::TransferBasicData (SInt64& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetInt64(); } template<> inline void JsonRead::TransferBasicData (UInt64& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetUint64(); } template<> inline void JsonRead::TransferBasicData (float& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetDouble(); } template<> inline void JsonRead::TransferBasicData (double& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetDouble(); } template<> inline void JsonRead::TransferBasicData (char& data) { // jsonWriter.String(data); // const rapidjson::Value& value = *(valueStack.top()); // data = value[currentKey.c_str()].GetInt64(); } template<> inline void JsonRead::TransferBasicData (SInt8& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetInt(); } template<> inline void JsonRead::TransferBasicData (UInt8& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetUint(); } template<> inline void JsonRead::TransferBasicData (int& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetInt(); } template<> inline void JsonRead::TransferBasicData (long& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetInt(); } template<> inline void JsonRead::TransferBasicData (unsigned int& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetUint(); } template<> inline void JsonRead::TransferBasicData (unsigned long& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetUint(); } template<> inline void JsonRead::TransferBasicData (SInt16& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetInt(); } template<> inline void JsonRead::TransferBasicData (UInt16& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetUint(); } template<> inline void JsonRead::TransferBasicData (bool& data) { const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetBool(); } template<> inline void JsonRead::TransferBasicData (std::string& data) { // jsonWriter.String(data.c_str()); const rapidjson::Value& value = *(valueStack.top()); data = value[currentKey.c_str()].GetString(); } template void JsonRead::TransferSTLStyleArray (T& data, int metaFlag) { rapidjson::Value* value = valueStack.top(); rapidjson::Value* arr = &((*value)[currentKey.c_str()]); SerializeTraits::ResizeSTLStyleArray (data, arr->Size()); typename T::iterator dataIterator = data.begin (); for (int i = 0; i < arr->Size(); i++) { rapidjson::Value* obj = &((*arr)[i]); valueStack.push(obj); Transfer(*dataIterator, "data", metaFlag); ++dataIterator; valueStack.pop(); } } NS_RRP_END #endif /* JsonRead_h */