如何用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
相关产品推荐
相关产品推荐

