Skip to main content
Version: 3.5

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 服务
  • ...