You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:18:10