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

如何用nlohmann json将仅提供getPointer()的Tensor数据写入JSON?

实现Tensor到JSON的序列化方案

核心思路

利用getPointer()获取Tensor的浮点数据指针,结合已知的尺寸/形状信息计算总元素数,将指针指向的数据复制到std::vector<float>(JSON库原生支持该类型序列化),最后构建目标格式的JSON对象。

具体实现代码

1. 直接在现有代码中扩展处理Tensor

假设你已经通过Tensor的接口(比如getShape())拿到形状数组,或者已知总元素数totalElements:

State stateObj; 

// 保留原有的vector类型数据处理逻辑
frameJson["arrays"] = {{"array1", stateObj.array1}, {"array2", stateObj.array2}};

// 处理Tensor数据
float* tensorPtr = stateObj.tensor1.getPointer();
// 计算总元素数:遍历形状数组相乘得到总数,若有直接获取总元素的接口可直接调用
size_t totalElements = 1;
const auto& shape = stateObj.tensor1.getShape(); // 假设返回std::vector<size_t>
for (size_t dim : shape) {
    totalElements *= dim;
}

// 将Tensor连续内存中的数据复制到vector
std::vector<float> tensorData(tensorPtr, tensorPtr + totalElements);

// 构建目标格式的JSON节点
frameJson["tensor"] = {{"tensor", tensorData}};

2. 集成到to_json()重载(规范的自定义类型序列化)

如果想让State结构体的序列化逻辑更统一,直接重载to_json函数:

#include <nlohmann/json.hpp>
using json = nlohmann::json;

// 假设structA已实现对应的to_json重载
void to_json(json& j, const State& s) {
    // 处理vector数组
    j["arrays"] = {{"array1", s.array1}, {"array2", s.array2}};

    // 处理Tensor
    float* tensorPtr = s.tensor1.getPointer();
    size_t totalElements = 1;
    const auto& shape = s.tensor1.getShape();
    for (size_t dim : shape) {
        totalElements *= dim;
    }
    std::vector<float> tensorVec(tensorPtr, tensorPtr + totalElements);
    j["tensor"] = {{"tensor", tensorVec}};
}

// 使用时直接序列化整个State对象
json frameJson = stateObj;

注意事项

  • 确保Tensor的数据是连续内存存储:绝大多数深度学习框架的Tensor默认是连续的,若遇到非连续Tensor,需先调用框架的“转连续”接口(如PyTorch的contiguous())再获取指针。
  • 内存有效性:复制数据时,Tensor对象必须处于有效状态(未被销毁),避免使用悬空指针。

内容的提问来源于stack exchange,提问作者Nitron_707

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:03:43