小程序 setData 方法支持路径表达式来设置属性,例如 setData({"x.y.z": 1})

微信官方没有公布路径表达式的语法规则及解析规则,本文所描述的路径表达式解析规则由 miniprogrampatch 实现并总结而来。

概述

小程序的路径表达式基本操作符包括对象属性访问符.和数组成员访问符[]

例如:

  • a.b 表示访问对象 ab 属性。
  • 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[12x.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

微信小程序路径表达式解析规则的更多相关文章

  1. ****微信小程序架构解析

    | 导语   微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走.媲美原生体验.完善的文档.高效的开发框架,小程序给开发者带来了很多惊喜.通过这篇文章和大家一起分析小程序的架构,分享开发 ...

  2. 一起脱去小程序的外套和内衣 - 微信小程序架构解析

    版权声明:本文由渠宏伟  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/760767001484042227 来源:腾云阁 ...

  3. 微信小程序如何解析html内容

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

  4. 微信小程序session_key解析中反斜杠问题处理 Java解析

    Java服务端微信小程序解密用户信息.手机号需用到session_key也需要decode,以下是官方描述: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId ...

  5. 微信小程序xml解析

    准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...

  6. 微信小程序开发——活动规则类文案文件读取及自动转换为小程序排版代码

    前言: 最近做的小程序活动规则内容比较多,且一直处于修改中.由于小程序并不支持类似Html5中的预排版,所以,活动规则内容修改较大的时候,仍需要对新的内容用小程序的<text>组件做下排版 ...

  7. 微信小程序转义解析渲染html

    今天开发小程序时,想调用商品详情字段,发现大部分是用编辑器编辑的html原生标签,无法在小程序直接使用. 后面自己使用正则和字符串替换,效果也不佳. 最后在网上找到了wx-mina-html-view ...

  8. 微信小程序异常解析

    文件解析错误 SyntaxError: Unexpected end of JSON input: 在子目录下添加空白的json配置文件是会出现报错,其原因是因为文件内容空白 pages/index/ ...

  9. 微信小程序, 解析↵换行

    获取到json中的数据,通过“\n”转义,此时我们需要通过正则表达式来替换一下 replace(/↵/g, '\n');   在页面中可以这样 <text class="test-ti ...

随机推荐

  1. ApiPost(中文版postman)如何发送一个随机数或者时间戳?

    什么是ApiPost内建变量:ApiPost提供了5个内建变量,如下: {{$guid}} //生成GUID {{$timestamp}} //当前时间戳 {{$microTimestamp}} // ...

  2. idea使用过程中的一些常见问题,做个笔记

    :当实现这个接口方法时重载是不允许的. 首先我相信我的代码肯定没问题,因为我实现的接口确实有这个方法.在编程阶段就提示这个错误,于是我有理由相信应该是编译错误!通过google,解决办法so easy ...

  3. win10自带截屏操作

    1.win+shift+S,自由截屏 2.win+W,截屏后编辑 3.alt+PrtSc,截取当前活动界面,鼠标在微信就是微信,在浏览器就是浏览器.在桌面就是所有界面. 4.PrtScn,截取所有屏幕 ...

  4. Linux操作系统的日志管理之rsyslog实战案例

    Linux操作系统的日志管理之rsyslog实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志介绍 1>.什么是日志 历史事件: 时间,地点,人物,事件 日志级 ...

  5. 201871010135 张玉晶 《面向对象程序设计(java)》第二周学习总结

    201871010135 张玉晶 <面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. mybatis框架-choose when otherwise 的使用

    需求:模拟实际业务情况,传入多条件进行查询 /** * 需求:模拟实际业务,用户传入多个条件,进行用户列表信息的查询 * @param roleids * @return */ public List ...

  7. 异常DBG_PRINTEXCEPTION_C(0x40010006)和DBG_PRINTEXCEPTION_WIDE_C(0x4001000A)

    简介 DBG_PRINTEXCEPTION_C,代码0x40010006:DBG_PRINTEXCEPTION_WIDE_C,代码0x4001000A:在调试器的控制台窗口打印异常信息/调试信息.它定 ...

  8. django -- ORM查询

    前戏 在我们之前操作ORM中,你也许是启动Django项目,通过地址访问固定的函数,或者在pycharm里的python console里执行,第一种比较麻烦,而且每次都要启动项目,写路由,第二种虽然 ...

  9. nodejs进程管理

    NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用. 我们已经知道了Node ...

  10. java_home not found in your enviroment 问题解决方法

    java_home not found in your enviroment 错误原因有一下几点 1. JAVA_HOME系统环境没配置, JAVA_HOME环境变量配置方法: <1> 右 ...