jsonpath是一种从json中抽取信息的工具,能够降低json数据处理复杂度,提高可读性与可维护性。jsonpath之于json相当于Xpath之于XML。为减少业务需求中频繁处理json数据逻辑的痛点,为nlohmann/json库手码jsonpath功能。
支持功能
costan225/jsonpath除函数调用功能(C++可以更高效直接操作target data得到统计数据)外,支持大部分jsonpath标准。另外根据实际需求,添加了数据替换功能,能够对抽取结果做修改。
用到的核心库:Boost-Spirit X3, Range-V3。Spirit是Boost的解析器框架,遵循Extended Backus Naur Form (EBNF) 规范,Spirit-X3是Spirit新一代版本,优化了编译时间(极大解放了生产力)和runtime性能。Range-V3是c++20 Ranges库的source,是FP风格编码的理想选择。
支持语法功能
功能示例 | 是否支持 | 功能描述 |
---|---|---|
.prop | 是 | 名为prop的子节点 |
[prop] | 否 | 名为prop的子节点 |
* | 是 | 通配符, 当前节点的所有孩子节点 |
..prop | 是 | 递归搜索名为prop的子节点 |
[beg:step:end] | 是 | 数组[beg,end),步长step可选 |
[?(expression)] | 是 | 过滤器表达式,用于数组 |
.func() | 否 | 函数,可供result对象调用 |
支持过滤器功能
过滤器功能 | 是否支持 | 功能描述 |
---|---|---|
@ | 是 | 过滤器引用当前节点 |
$ | 是 | 过滤器引用根节点 |
prop1 > prop2 | 是 | 比较操作符,支持 >/</==/>=/<= |
prop1 ~= regex | 是 | 正则表达式 |
exp1 && exp2 | 是 | 关系操作符,支持 |
prop in (set) | 否 | in nin 关键字 |
使用及示例
样本数据
1 | { |
语法示例
jsonpath | result |
---|---|
$.store.bicycle.color | [“red”] |
$.store.book[0,-1].price | [8.95, 22.99] |
$.store.book[-2:].price | [8.99, 22.99] |
$.store.book[0:3:2].price | [8.95, 8.99] |
$.store.book[?(@.isbn&&@.title==’Moby Dick’)].price | [8.99] |
$.store.book[?(@.price<$.expensive)].price | [8.95, 8.99] |
$.store.book[?(@.title~=/Sword.*/i)].author | [“Evelyn Waugh”] |
$..price | [19.95, 8.95, 12.99, 8.99, 22.99] |
代码示例
1 | // header files |
与golang版本性能对比
选取github上star较高并支持filter的oliveagle/jsonpath库作对比。批量执行100000次查找。
C++版本
1 | auto p = jsonpath("$.store.book[?(@.price<$.expensive)]"); |
1 | time ./jsonpath-c++ |
golang 版本
1 | pat, _ := jsonpath.Compile(`$.store.book[?(@.price < $.expensive)]`) |
1 | time ./jsonpath-golang |