NASL AST Node Path 协议 v1.0
1. 介绍
- 版本号:1.0
- 别名:JSON Path 协议
- 提案人:赵雨森
- 评审人:NASL 技术委员会全体成员
(1) 背景
目前 NASL AST 以 JSON 形式进行表达,常以 JS Object、MongoDB 等方式进行存储和读写,需要一种通用的树节点路径的表达方式。
(2) 适合范围
适用于读取、操作(修改、替换、删除)、标注 NASL AST。也适用于一般读取、操作(修改、替换、删除)、标注 JSON 内容的场景。
2. 协议描述
(1) 定义
用于匹配 JSON 中任意值的有规则的字符串。
(2) 语法
(2.1) 语法定义
grammar NANPv1
entry NANP:
step+=Step ('.' step+=Step)*;
Step:
key=ID ('[' expr=(INDEX | FindExpr) ']')?;
FindExpr:
key=ID value=VALUE;
terminal INDEX: /\d+/;
terminal VALUE: /=[^=.[\]]+/;
terminal ID: /[a-zA-Z_][\w_]*/;
(2.2) 语法说明
JSON 的类型只有三种:基本类型、数组和对象。
基本语法
.
:表示下一级对象属性[number]
:表示下一级数组索引
示例:app.logics[3].name
。
tip
注意:该协议规定了 JSON 的字段名必须为字母数字和下划线组成。如果字段名中包含了其他字符,请扩展该协议。
因此取对象字段只需用.
作为分隔符,仅使用基本语法的情况下,可以在直接使用 Lodash 的 at 或 JavaScript 的 eval
函数进行取值。
参考常见的 Lodash 的 at
查找语法
因为数组索引有时不是很直观,我们需要一些更常用的查找语法。
[key=value]
:返回数组中 key 属性等于 value 的对象。如果查找出多个,只取第一个,如果没有直接返回 null。
参考属性选择器
(2.3) 语法示例
app
app.name
app.logics[0]
app.logics[name=logic1]
app.structures[name=Structure1].properties[name=property1]
...
3. 协议生态
目前以下设施使用了该协议:
- NASL Storage 服务
- LCAP IDE
- 数据层
- 渲染层
- ...
- NL2NASL 服务
- ...