小程序 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. 隐马尔科夫模型(Hidden Markov Models) 系列之一

    转自:http://blog.csdn.net/eaglex/article/details/6376826 介绍(introduction) 通常我们总是对寻找某一段时间上的模式感兴趣,这些模式可能 ...

  2. 集合(set)

    '''set是一个无序(不支持索引和切片)而且不重复的集合,有些类似于数学中的集合,也可以求交集,求并集等,''' s1={1,2,3,1} #定义一个set s1 如果s1={}为空则默认定义一个字 ...

  3. terminator

    terminator 能够实现linux 终端的分屏显示. 安装 sudo add-apt-repository ppa:gnome-terminator sudoapt-get update sud ...

  4. 【Servlet】Servlet的配置

    创建时间:6.15 Servlet的配置 1. 基本配置 其中url-pattern的配置方式: 1)完全匹配 访问的资源与配置的资源完全相同才能访问到 2)目录匹配 格式:/虚拟的目录../*   ...

  5. python 和 R 中的整数序列

    python 中的 range() 函数是很常用的,R  中相应的函数是 seq(), 其实,R 中的“ :”也能代替 python 中的 range() 函数. 1.生成升序整数序列 python: ...

  6. python3用turtle库进行绘制小猪佩奇图案

    晚上闲着无事,深入学习这个turtle用法,就做了小猪佩奇图 附上代码: # coding: utf-8 #功能:绘画小猪佩奇 import turtle as t t.screensize(400, ...

  7. PHP实例:获取操作系统、IP、地理位置、浏览器、等信息

    获取访客操作系统以及浏览器语言 <?php function GetBrowser(){ if(!empty($_SERVER['HTTP_USER_AGENT'])){ $br = $_SER ...

  8. centos安装安全狗提示Need system command 'locate' to install safedog for linux的解决方法

    今天为客户的centos服务器安装安全狗时提示Need system command 'locate' to install safedog for linux.Installation aborte ...

  9. Windbg Register(寄存器)窗口的使用

    寄存器是位于在 CPU 的小易失性内存单位. 许多寄存器专用于特定用途,并可用于用户模式应用程序使用的其他寄存器. 基于 x86 和基于 x64 的处理器在有可用的寄存器的不同集合. 如何打开寄存器窗 ...

  10. 2015-2016 ACM ICPC Baltic Selection Contest D - Journey(广搜)