使用nlohmann库转换LPUSHORT为JSON遇赋值错误求助
解决nlohmann JSON库处理LPUSHORT类型的赋值错误
问题根源
你编写的to_json重载不符合nlohmann库的序列化约定:库期望该函数将输入类型直接转换为对应的JSON值(比如数组、对象),但你的实现是往传入的JSON对象中添加list键,而非将传入的JSON变量设置为目标类型对应的结构。这种逻辑偏差导致赋值操作时,库无法找到匹配的运算符完成类型转换。
修正方案
1. 重写to_json重载函数
将LPUSHORT(以0结尾的无符号短整型数组指针)转换为JSON数组,而非修改传入JSON的内部结构:
#include <nlohmann/json.hpp> using json = nlohmann::json; typedef unsigned short USHORT; typedef USHORT* LPUSHORT; void to_json(json& j, LPUSHORT lp) { j = json::array(); // 先初始化JSON为数组类型 if (!lp) { // 处理空指针,避免崩溃 return; } while (*lp != 0) { // 用0代替NULL,避免指针与数值类型不匹配的警告/错误 j.push_back(*lp); lp++; } }
2. 正确赋值LPUSHORT类型
修正后直接赋值即可,nlohmann库会自动调用你重载的to_json函数完成转换:
// 假设lp是你的结构体指针,lp->nids为LPUSHORT类型 resultJson["nids"] = lp->nids;
完整示例
#include <nlohmann/json.hpp> #include <iostream> using json = nlohmann::json; typedef unsigned short USHORT; typedef USHORT* LPUSHORT; void to_json(json& j, LPUSHORT lp) { j = json::array(); if (!lp) { return; } while (*lp != 0) { j.push_back(*lp); lp++; } } // 示例结构体 struct MyStruct { LPUSHORT nids; }; int main() { USHORT test_ids[] = {100, 200, 300, 0}; // 以0结尾的数组 MyStruct data; data.nids = test_ids; json resultJson; resultJson["nids"] = data.nids; // 输出结果:{"nids": [100, 200, 300]} std::cout << resultJson.dump(4) << std::endl; return 0; }
注意事项
- 用
0代替NULL:NULL是指针类型,与unsigned short比较会触发类型不匹配警告(C++11后NULL可能被定义为nullptr,直接比较会报错)。 - 增加空指针判断:避免传入空指针时访问非法内存导致程序崩溃。
内容的提问来源于stack exchange,提问作者mazi
相关产品推荐
相关产品推荐

