使用to_json方法使用nlohmann json将特征矩阵写入json文件

axr492tv  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(177)

我定义了一个特征矩阵-

template <typename T>
using Vec3 = Eigen::Matrix<T, 1, 3, Eigen::DontAlign | Eigen::ColMajor>;
using Vec3d = Vec3<double>;

字符串
我试着把Vec 3d写到json文件中,如下所示-

template <typename T>
void to_json(json& j, const Vec3<T>& v) {
    j = {{"X", v(0)}, {"Y", v(1)}, {"Z", v(2)}};
}

// Usage
Vec3d test(1.f, 2.f, 3.f);
frameJson["Vec3d"] = test;


输出存储为array,而不是像to_json中指定的方式,似乎它没有进入to_json??

"Vec3d": [
 1.0,
 2.0,
 3.0
]


但我希望它像下面的to_json中指定的方式-

"Vec3d": [
 "X": 1.0,
 "Y": 2.0,
 "Z": 0.0
]


模板化的to_json的实现方式有什么问题吗?我该怎么做。
PS:模板化的adl_serializer from_json()在阅读时会是什么样子?

ilmyapht

ilmyapht1#

我没有找到默认的Eigen::Matrix json序列化器的实现位置,但是要让你的自定义序列化器工作,只需将它放在Eigen命名空间中:

namespace Eigen
{
    template <typename T>
    void to_json(json& j, const Vec3<T>& v) {
    j = {{"X", v(0)}, {"Y", v(1)}, {"Z", v(2)}};
}

字符串
或者,像第三方类型序列化文档中建议的那样,您可以编写adl_serializer专门化:

namespace nlohmann {
    template <typename T>
    struct adl_serializer<Vec3<T>> {
        static void to_json(json& j, const Vec3<T>& v) {
            j = {{"X", v(0)}, {"Y", v(1)}, {"Z", v(2)}};
        }
        static void from_json(const json& j, Vec3<T>& v) {
            v(0) = j["X"];
            v(1) = j["Y"];
            v(2) = j["Z"];
        }
    };
}


第二个选项通常更可取,因为它不会污染第三方名称空间。
Demo

相关问题