Boost JSON 序列化格式(boost 1.76.0)

Boost JSON serialization format (boost 1.76.0)

如何在boost json库中控制序列化格式。我正在尝试序列化此对象,并且浮点数正在以科学记数法输出。如何以固定符号输出,如 12000000 而不是 1.2E7?而 0 而不是 0E0。

{"id":"de69041b-141b-4e01-b349-458f26f08259","price":3.343403E12,"qty":1.2E7}
{"id":"de69041b-141b-4e01-b349-458f26f08259","price":0E0,"qty":0E0}

这是一个最小的程序,它将以指数格式输出浮点数(ubuntu 20.04,g++ 9.3.0,boost 1.76.0)

#include <iostream>
#include <boost/json/src.hpp>

using namespace std;
namespace bj = boost::json;

int main(void)
{
    bj::object obj1 = {
        {"id", 1},
        {"price", 3343403000000.00},
        {"qty", 13546000000000.00}
    };

    bj::object obj2 = {
        {"id", 2},
        {"price", 0.0},
        {"qty", 0.0}
    };
    cout << "obj1:" << bj::serialize(obj1) << endl;
    cout << "obj2:" << bj::serialize(obj2) << endl;

    return 0;
}

输出:

obj1:{"id":1,"price":3.343403E12,"qty":1.3546E13}
obj2:{"id":2,"price":0E0,"qty":0E0}

据我所知,这不是一项功能。在验收之前对图书馆进行审查时,在 boost 邮件列表上进行了相当多的讨论,因此如果您愿意,可以查看档案以了解基本原理。

我的记忆是,该库专注于促进机器到机器传输的狭窄功能集(JSON 的 99%,例如在 restful API 中)。这意味着关注

  • 改正
  • 让它变快

大约一天前出现了同样的事情:Is there a way to switch boost::json::serializer to beautified output?(我从文档介绍部分引用)

我唯一能想到的就是破解现有的 PrettyPrint 示例,并修改双输出部分以更改格式。

  case json::kind::double_:
    os << jv.get_double();
    break;

This question 展示了如何使用旧方法,以及 C++20 中的新内容:

添加一些流格式:

  #include <iomanip>

  case json::kind::double_:
    os << std::fixed << std::setw(10) << std::setprecision(5)
       << jv.get_double();
    break;

或新奇的

  case json::kind::double_:
    os << std::format("{:10.5}", jv.get_double());
    break;