微信小程序路径表达式解析规则
小程序 setData 方法支持路径表达式来设置属性,例如 setData({"x.y.z": 1})。
微信官方没有公布路径表达式的语法规则及解析规则,本文所描述的路径表达式解析规则由 miniprogrampatch 实现并总结而来。
概述
小程序的路径表达式基本操作符包括对象属性访问符.和数组成员访问符[]。
例如:
a.b表示访问对象a的b属性。a[0]表示访问数组a的第 2 个成员。a[0]b表示访问数组a的第 2 个成员的b属性。
当对象属性访问符和数组成员访问符连在一起时,可以省略书写属性访问符。
数组关闭符与属性访问符在特殊情况下省略属性访问符会产生歧义,参见下文“路径表达式解析奇葩规则”。
例如:a.[0].b 等同于 a[0]b。
路径表达式语法规则
路径表达式必需满足以下条件:
- 必需是一个字符串,或者可以转换成字符串的原始数据类型或者对象。
- 不能是空字符串。
- 不能以数组符号开头,即路径不能以字符串
[开头。 - 不能以未关闭的数组符号加上属性表达式结尾,例如
a[bc是非法的。 - 不能存在空数组表达式,即不能包含
[]字符。 - 第一个数组表达式关闭符号
]不能在第一个数组表达式起始符号[之前。
路径表达式解析时会遵循以下规则:
- 连续多个属性访问符会被转换为一个,即
a...b.c等于a.b.c。 - 以属性访问符开头或结尾会被删除,即
.a.b.等同于a.b。 - 处于结尾的未关闭数组表达式会被删除,即
x.y[12,x.y[[[[均等同于x.y。 - 连续多个空字符串会被转换为一个。
路径表达式解析时奇葩规则:
- 数组表达式中只能包含数字、句号、左方括号。
- 所以数组表达式中不能使用负数,例如
a[-1]是非法的。 - 数组表达式中的句号和左方括号都将被删除,例如
a[.1.1.]等同于a[11],a[.[.[[1]等同于a[1]。
- 所以数组表达式中不能使用负数,例如
- 每个单独的数组关闭符号
]都会生成新的数组,而所有单独的数组关闭符号之间的字符串(不包含属性访问符.)将被提取出来拼接成一个属性名称。- 例如
x[1]2]3] 4x ]y等同于x[1][0][0][0]23 4x y,但x[1]2]3] 4x ].y等同于x[1][0][0][0]23 4x .y。(此处不满足上文所说属性访问符和数组访问符在一起时可以省略书写属性访问符的规则)
- 例如
- 当单独数组关闭符号中间包含属性访问符时,优先解析属性访问符。
- 例如
x[1]2].a3]x等同于x[1][0]2[0]a3x。
- 例如
示例
合法路径及其解析结果:
| 原路径 | 解析结果 |
|---|---|
| "x" | "x", |
| "x.y.z" | "x.y.z", |
| "1.2" | "1.2", |
| "x.y.[2][12]xy.z" | "x.y[2][12]xy.z", |
| "x.y[11.11]z" | "x.y[1111]z", |
| "x.y[.11.]z" | "x.y[11]z", |
| "x[1111" | "x", |
| "x[1[2]23" | "x[12]23", |
| "x[1][2]]]]y" | "x[1][2][0][0][0]y", |
| "x[1].[.[.[2]]]]y" | "x[1][2][0][0][0]y", |
| "x[1]23]4]5]6]y" | "x[1][0][0][0][0]23456y", |
| "x[1]23]4]5x ]6]" | "x[1][0][0][0][0]2345x 6", |
| "x[1]23]4]5]6].y" | "x[1][0][0][0][0]23456.y", |
| "b[1]2].a3].x" | "b[1][0]2[0]a3.x" |
非法路径及其非法原因:
| 原路径 | 非法原因 |
|---|---|
| "" | 空字符串非法 |
| "[1]x" | 数组开头非法 |
| "x]][0]" | 第一个 ] 出现在第一个 [ 之前 |
| "x[a]" | 数组中只能包含数字 |
| "x[abc" | 未关闭数组符号,且紧跟非数字 |
| "x[]" | 存在空数组符号 |
| "x[-1]" | 数组中只能包含数字 |
| "x[ 1]" | 数组中只能包含数字 |
| "x[.]" | 数组中的句号会被删除,导致存在空数组 |
| "x[1 1]" | 数组中只能包含数字 |
| "x[ ]" | 数组中只能包含数字 |
小程序路径表达式解析方案具体实现及测试参见 miniprogrampatch
微信小程序路径表达式解析规则的更多相关文章
- ****微信小程序架构解析
| 导语 微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走.媲美原生体验.完善的文档.高效的开发框架,小程序给开发者带来了很多惊喜.通过这篇文章和大家一起分析小程序的架构,分享开发 ...
- 一起脱去小程序的外套和内衣 - 微信小程序架构解析
版权声明:本文由渠宏伟 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/760767001484042227 来源:腾云阁 ...
- 微信小程序如何解析html内容
最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...
- 微信小程序session_key解析中反斜杠问题处理 Java解析
Java服务端微信小程序解密用户信息.手机号需用到session_key也需要decode,以下是官方描述: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId ...
- 微信小程序xml解析
准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...
- 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码
前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...
- 微信小程序转义解析渲染html
今天开发小程序时,想调用商品详情字段,发现大部分是用编辑器编辑的html原生标签,无法在小程序直接使用. 后面自己使用正则和字符串替换,效果也不佳. 最后在网上找到了wx-mina-html-view ...
- 微信小程序异常解析
文件解析错误 SyntaxError: Unexpected end of JSON input: 在子目录下添加空白的json配置文件是会出现报错,其原因是因为文件内容空白 pages/index/ ...
- 微信小程序, 解析↵换行
获取到json中的数据,通过“\n”转义,此时我们需要通过正则表达式来替换一下 replace(/↵/g, '\n'); 在页面中可以这样 <text class="test-ti ...
随机推荐
- android studio学习---菜单栏BUILD功能
项目构建: 1.构建项目 2.重构项目 3.签名打包
- php超时时间说明【转】
一,http请求超时时间 可能出现的场景: 1,curl进程运行了一个世纪还木结束,curl的时候设置了超时时间 --connect-timeout 1000 2,operation timed ou ...
- 阿里云 OSS文件存储挂到云服务器ESC文件系统中
ossfs能让您在Linux系统中,将对象存储OSS的存储空间(Bucket)挂载到本地文件系统中,您能够像操作本地文件一样操作OSS的对象(Object),实现数据的共享. 使用限制 ossfs使用 ...
- postgresql plv8 安装
网上可以看到pg 9.6 版本的plv8容器镜像,没有pg 高版本的支持镜像,但是在基于原有dockerfile 进行构建的时候,居然失败了,有墙的问题,有版本的问题 所以通过虚拟机尝试下构建方式安装 ...
- ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机每隔一定时间 使用 http 获取天气
前言: 实现功能概要: STM32使用AT指令控制Wi-Fi以TCP方式连接服务器(YY天气Web服务器),然后使用http的get协议获取今天的天气数据 单片机提取今天的温度和湿度数据,把温湿度数据 ...
- Python3 异常
异常 --- 程序执行时产生的事件,为Python对象 <Python学习手册>笔记 异常总是通过实例对象来识别 默认的异常处理器 --- 打印标准出错信息(包括引发的异常和堆栈跟踪-异常 ...
- 运维-kibana常用查询使用
1.登录服务器地址 http://kibana.ops.xxx.com.cn/ 查询语法: 支持 AND , OR, && || >,< ,=模糊 *,! 1.如查询n ...
- zabbix php-fpm监控
#!/bin/bash################################### Zabbix monitoring script## php-fpm:# - anything avail ...
- 【Activiti学习之五】BPMN事件
环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.事件定义1.定时器事件(1)timeDate:指定时间触发<timerEven ...
- Solr7.x学习(8)-使用spring-data-solr
1.maven配置 <dependency> <groupId>org.springframework.data</groupId> <artifactId& ...