|
本帖最后由 小小小小鸟 于 2025-3-21 17:20 编辑
火山自带JSON库,由于各种各样的原因(内部有UTF8和UTF16的转码影响效率,json对象取值时是线性查找也影响效率,路径支持不完善等等),不方便使用,便自己写一款,命名有部分仿照易语言E2EE支持库(致敬),有以下特点:
1、【存取键值表】对应【JSON对象类】。【存取列表】对应【JSON数组类】。
2、键值表内部使用哈希表结构(Tessil/ordered-map,同时保证效率和键的顺序),列表内部使用std::vector结构。
3、取值和设置用嵌入式方法,不限参数,尽量方便编写代码,支持JSON PATH,JSON POINTER路径。比如:
json.置值 ("a", "b", 0, "c", "d", 0, "e", 888)
json.置值 ("//a.b[0].c.d.[0].['e']", 888)
json.置值 ("/a/b/0/c/d/0/e", 888)
最终结果都是等价的: {"a":{"b":[{"c":{"d":[{"e":888}]}}]}}
取值同样:
json.取整数值 ("a", "b", 0, "c", "d", 0, "e")
json.取整数值 ("//a.b[0].c.d.[0].['e']")
json.取整数值 ("/a/b/0/c/d/0/e")
也是等价的。
4、扩展支持存取火山对象和字节集。到Json时,对于字节集,将字节集数据转为base64文本写入结果,对于其它火山对象,将取对象数据转为base64文本写入结果(只支持取对象数据有结果的类)。注意: 从json载入后,base64文本会被识别为文本型,如需还原,字节集:base64文本到字节集(取出的文本);对象:对象.置对象数据(base64文本到字节集(取出的文本))。
5、利用火山宏和火山模板实现指针方便化操作,比如 存取键值表指针 使用方法完全和存取键值表一致,省略 读指针处对象(...)。
6、支持跨模块dll操作存取键值表和存取列表以及它们的指针。重载new和delete,所有内存的申请和释放调用系统api,避免内存泄漏和释放崩溃。
7、优化列表排序使用快速排序法。
8、JSON解析支持原位解析,较正常解析性能提升10%-40%(哈希表结构决定了原位解析无法像YYJSON那样提升明显,但是随机访问时复杂度近乎为O(1),本质为时间和空间的博弈)。注:JSON解析和到JSON用的RapidJSON的SAX风格解析技术,站在巨人的肩膀上,特此标明。
9、.......
欢迎测试使用,如有BUG或者建议,请随帖回复或加入QQ群695360425交流。
压缩包内为模块安装包(安装后为纯源码,无部件)和示例。
250321:优化存取键值表的取键数组和取键列表,进行预分配提速。
新增创建自字节集(从UTF16文本的字节集载入)和到字节集(转为JSON文本后再到字节集)。
修复JSON解析工具一处bug。
250320:
新增跨DLL传递键值表和列表例程。
新增是否为空方法,判断键值表或列表有无子成员。
修复列表指针一处文字性错误。
跨DLL调用示例:
250318: 规范命名和注释。
250317: 修复几处BUG,增加JSON解析工具示例:
|
|