• 问题反馈可发送邮件到stubbornhuang@qq.com

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

C++ – nlohmann json序列化输出字符串时指定输出浮点数小数点后几位

C++ 发布于2024-08-10 阅读 2,322次 0次评论 0次点赞 本文共1446个字,阅读需要4分钟。

1 nlohman json序列化输出字符串

1.1 存在的问题

nlohman json的json对象中有浮点数时,序列化之后的json字符串中浮点数过长,比如

#include <iostream>

#include "nlohmann/json.hpp"

int main() {
    nlohmann::json root;
    root["value1"] = 0.9445641561631231;
    root["value2"] = 0.14654564561;
    root["value3"] = 0.154565465;
    root["value4"] = 7416546513.014654156;

    std::cout << root.dump() << std::endl;

    return 0;
}

上述代码输出

{
    "value1": 0.9445641561631231,
    "value2": 0.14654564561,
    "value3": 0.154565465,
    "value4": 7416546513.014654
}

在有些时候我们可能不需要这么精确地浮点数表示,只需要小数点后几位就行,当数据量比较多的时候,只保留浮点数小数点后几位更加有利于减少json字符串大小,节省带宽。

1.2 nlohman json序列化输出字符串只保留浮点数小数点后几位

我们可以通过一个后处理方法,将json对象中的浮点数做小数点减少,具体的实现代码如下

#include <iostream>
#include <sstream>

#include "nlohmann/json.hpp"

inline void serialize_with_precision(nlohmann::json& j, int precision = 3) {
    if (j.is_number_float()) {
        std::ostringstream oss;
        oss << std::fixed << std::setprecision(precision) << j.get<double>();
        j = oss.str(); // 将浮点数替换为格式化后的字符串  
    }
    else if (j.is_object()) {
        for (auto& it : j.items()) {
            serialize_with_precision(it.value(), precision);
        }
    }
    else if (j.is_array()) {
        for (auto& elem : j) {
            serialize_with_precision(elem, precision);
        }
    }
    // 对于其他类型(如整数、布尔值、字符串等),不做处理  
}

int main() {
    nlohmann::json root;
    root["value1"] = 0.9445641561631231;
    root["value2"] = 0.14654564561;
    root["value3"] = 0.154565465;
    root["value4"] = 7416546513.014654156;

    serialize_with_precision(root, 3);

    std::cout << root.dump() << std::endl;

    return 0;
}

输出结果如下

{
    "value1": "0.945",
    "value2": "0.147",
    "value3": "0.155",
    "value4": "7416546513.015"
}

我们通过一个递归操作对json对象中的所有float对象进行了格式转换,不过这里有个问题是序列化之后数值变成了字符串,不过这可以在json解析操作中进行处理。

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – nlohmann json序列化输出字符串时指定输出浮点数小数点后几位

原文链接:https://www.stubbornhuang.com/3062/

发布于:2024年08月10日 10:25:41

修改于:2024年08月10日 10:25:41

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
Python - 使用python将fbx中的动作信息转换为bvh动作文件
Blender
下一篇
计算几何 - 使用de Casteljau算法实现的三次贝塞尔曲线插值函数
计算几何
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号