IT评测·应用市场-qidao123.com

标题: C/C++ json库 [打印本页]

作者: 钜形不锈钢水箱    时间: 2024-7-24 08:22
标题: C/C++ json库
一、介绍

1.1 json 介绍


二、C/C++ json 库选型

2.1 选型范围



2.2 jsoncpp


2.2.2 jsoncpp 编译和交叉编译


指定连接静态库
  1. g++ jsoncpp-test.cpp -I./include -L ./lib -l:libjsoncpp.a
复制代码
2.3 rapidjson



2.4 nlohmann/json


2.5 sonic-cpp


五、常见问题

5.1 jsoncpp 中关于浮点数的控制和中文显示问题


5.2 jsoncpp序列化double类型时精度损失问题的解决办法


解决办法1:此法不需要改源码,使用StreamWriterBuilder举行序列化
  1. #include <json/json.h>
  2. #include <json/writer.h>
  3. #include <iostream>
  4. #include <string>
  5. void test_precision(int precision)
  6. {
  7.     Json::Value root;
  8.     root["pi"] = 3.1415926;
  9.     root["count"] = 43.32558674566;
  10.     Json::StreamWriterBuilder builder;
  11.     //设置精度 注意这个默认设置的是数字总长度
  12.     //如果想设置小数点后的位数需设置precisionType为decimal
  13.     builder.settings_["precision"] = precision;
  14.     //设置精度类型 只可设置2种字符串 significant精度位数为数字总长度(jsoncpp默认为此类型) decimal精度位数为小数点后的长度
  15.     builder.settings_["precisionType"] = "decimal";
  16.     // 设置输出为紧凑格式,不带换行和空格
  17.     builder["commentStyle"] = "None";   // 防止输出注释,默认就是none
  18.     builder["indentation"] = "";        // 空字符串表示不缩进
  19.     std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
  20.     std::ostringstream oss;
  21.     writer->write(root, &oss);
  22.     std::string jsonText = oss.str();
  23.     // 输出 JSON 字符串
  24.     std::cout << "specified precision: " << precision << ", content:" << jsonText << std::endl;
  25. }
  26. int main() {
  27.     for(int i=17; i>=0; i--)
  28.     {
  29.         test_precision(i);
  30.     }
  31.     return 0;
  32. }
复制代码
  1. specified precision: 17, content:{"count":43.32558674565999723,"pi":3.14159260000000007}
  2. specified precision: 16, content:{"count":43.3255867456599972,"pi":3.1415926000000001}
  3. specified precision: 15, content:{"count":43.325586745659997,"pi":3.1415926}
  4. specified precision: 14, content:{"count":43.32558674566,"pi":3.1415926}
  5. specified precision: 13, content:{"count":43.32558674566,"pi":3.1415926}
  6. specified precision: 12, content:{"count":43.32558674566,"pi":3.1415926}
  7. specified precision: 11, content:{"count":43.32558674566,"pi":3.1415926}
  8. specified precision: 10, content:{"count":43.3255867457,"pi":3.1415926}
  9. specified precision: 9, content:{"count":43.325586746,"pi":3.1415926}
  10. specified precision: 8, content:{"count":43.32558675,"pi":3.1415926}
  11. specified precision: 7, content:{"count":43.3255867,"pi":3.1415926}
  12. specified precision: 6, content:{"count":43.325587,"pi":3.141593}
  13. specified precision: 5, content:{"count":43.32559,"pi":3.14159}
  14. specified precision: 4, content:{"count":43.3256,"pi":3.1416}
  15. specified precision: 3, content:{"count":43.326,"pi":3.142}
  16. specified precision: 2, content:{"count":43.33,"pi":3.14}
  17. specified precision: 1, content:{"count":43.3,"pi":3.1}
  18. specified precision: 0, content:{"count":43,"pi":3}
复制代码

不敷之处:
StreamWriterBuilder序列化的字符串是可读情势的,就像上面的输出,是有换行和缩进的(转换效率会比FastWrite低),我的服务端代码里实在不需要转换json为可读的,更需要的是效率,以是还有下面一种方法改FasetWrite源码
解决办法2:此法需要改源码,使用FastWriter举行序列化

C++ json序列化库有哪些,哪个性能最好
C++中有多种JSON序列化库可供选择,包罗但不限于以下几种:
在这些库中,sonic-cpp 被报道为性能最好的库,它不仅提供了高效的解析性能,还解决了其他一些库的缺点,如simdjson和yyjson的问题,并支持高效的增删改查利用 。别的,sonic-cpp已经在字节跳动的多个核心业务中大规模使用,并通过了工程化的磨练 。
假如您对性能有极高的要求,sonic-cpp可能是一个不错的选择。然而,选择哪个库还应考虑其他因素,如易用性、社区支持、库的活跃度和维护情况。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4