使用nlohmann's json库序列化嵌套结构体时遇到问题
问题解决:nlohmann JSON库序列化嵌套结构体失败
问题背景
尝试用nlohmann JSON库序列化GetRoomsResponse结构体,定义如下:
typedef struct GetRoomsResponse { unsigned int status; std::vector<RoomData> rooms; }GetRoomsResponse;
其中RoomData结构体定义在Room.h中:
typedef struct RoomData { unsigned int id; std::string name; unsigned int maxPlayers; unsigned int numOfQuestionsInGame; unsigned int timePerQuestion; unsigned int isActive; }RoomData;
按照文档定义了非侵入式序列化宏:
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GetRoomsResponse, status, rooms);
但编译时出现大量错误,尝试给RoomData添加默认构造函数后问题仍未解决。
问题原因
错误核心是nlohmann JSON库无法自动推导嵌套结构体RoomData的序列化规则。虽然为GetRoomsResponse添加了序列化宏,但库不知道如何处理std::vector<RoomData>类型的成员,必须显式为RoomData提供序列化/反序列化规则。
解决方案
给RoomData结构体也添加非侵入式序列化宏,具体步骤如下:
- 在
Room.h文件中确保已包含nlohmann JSON库头文件:
#include <nlohmann/json.hpp> using json = nlohmann::json;
- 在
RoomData结构体定义后,添加对应的序列化宏:
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(RoomData, id, name, maxPlayers, numOfQuestionsInGame, timePerQuestion, isActive);
- 确保在使用
GetRoomsResponse的序列化宏时,RoomData的定义及其序列化宏已被正确包含(比如在JsonResponsePacketSerializer.h中提前引入Room.h)。
完成以上操作后,库就能正确处理GetRoomsResponse中的std::vector<RoomData>成员,编译错误即可消除。
内容的提问来源于stack exchange,提问作者BeastasFiist
相关产品推荐
相关产品推荐

