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;
如何在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;