函数
在前一小节中,我们介绍了表达式,实际上函数也是表达式的一种。在 Luck-Report 当中提供了大量的内置函数,通过这些内置函数,可以实现各种各样的报表计算功能。函数语法格式如下:
函数名 ([表达式, 表达式...])下面我们就来逐个介绍 Luck-Report 内置的函数。
常用函数
count 函数 (统计数量)
count 函数是对给定的表达式在计算后对象数量进行统计。
| 示例 | 说明 |
|---|---|
| count(C1,C2) | 统计相对当前所在单元格,目标 C1 单元格以及 C2 单元格加在一起的数量 |
| count(C1) | 统计相对当前所在单元格,目标 C1 单元格数量 |
count(C1{age>20},C2{salary>2000 and degree=='本科'}) | 统计相对当前所在单元格,目标 C1 单元格绑定对象的 age 属性大于 20 的 C1 单元格以及 C2 单元格绑定对象的 salary 属性大于 2000 同时 degree 属性等于本科的单元格数量 |
count(C1{age>20}) | 统计相对当前所在单元格,目标 C1 单元格绑定对象的 age 属性大于 20 的 C1 单元格数量 |
sum 函数 (累加)
sum 函数是对给定的表达式在计算后值进行累加,sum 函数要求各个表达式计算后的值必须是数字,否则将产生错误。
| 示例 | 说明 |
|---|---|
| sum(C1) | 相对当前单元格,取到所有 C1 单元格值进行累加 |
sum(C1{age>20}) | 相对当前单元格,取到所有绑定对象属性 age 大于 20 的 C1 单元格值进行累加 |
| sum(C1,C2) | 相对当前单元格,取到所有 C1 和 C2 单元格的值进行累加 |
sum(C1{age>20},C2{salary>2000 and degree=='本科'}) | 相对当前单元格,取到所有绑定对象属性 age 大于 20 的 C1 单元格值以及绑定对象属性 salary 大于 2000 且 degree 属性等于本科的 C2 单元格的值进行累加 |
avg 函数 (求平均值)
avg 函数是对给定的表达式在计算后值求平均值,avg 函数要求各个表达式计算后的值必须是数字,否则将产生错误。
| 示例 | 说明 |
|---|---|
| avg(C1) | 相对当前单元格,求 C1 单元格的平均值 |
avg(C1{age>20}) | 相对当前单元格,取到绑定对象属性 age 大于 20 的 C1 单元格值的平均值 |
| avg(C1,C2) | 相对当前单元格,求 C1 和 C2 单元格的平均值 |
avg(C1{age>20},C2{salary>2000 and degree=='本科'}) | 相对当前单元格,取到所有绑定对象属性 age 大于 20 的 C1 单元格值以及绑定对象属性 salary 大于 2000 且 degree 属性等于本科的 C2 单元格的值进行求平均值 |
max 函数 (求最大值)
max 函数是对给定的表达式在计算后值求其中的最大值,max 函数要求各个表达式计算后的值必须是数字,否则将产生错误。
| 示例 | 说明 |
|---|---|
| max(C1) | 相对当前单元格,求 C1 单元格的最大值 |
max(C1{age>20}) | 相对当前单元格,取到绑定对象属性 age 大于 20 的 C1 单元格值的最大值 |
| max(C1,C2) | 相对当前单元格,求 C1 和 C2 单元格的最大值 |
max(C1{age>20},C2{salary>2000 and degree=='本科'}) | 相对当前单元格,取到所有绑定对象属性 age 大于 20 的 C1 单元格值以及绑定对象属性 salary 大于 2000 且 degree 属性等于本科的 C2 单元格的值进行求最大值 |
min 函数 (求最小值)
min 函数是对给定的表达式在计算后值求其中的最小值,min 函数要求各个表达式计算后的值必须是数字,否则将产生错误。
| 示例 | 说明 |
|---|---|
| min(C1) | 相对当前单元格,求 C1 单元格的最小值 |
min(C1{age>20}) | 相对当前单元格,取到绑定对象属性 age 大于 20 的 C1 单元格值的最小值 |
| min(C1,C2) | 相对当前单元格,求 C1 和 C2 单元格的最小值 |
min(C1{age>20},C2{salary>2000 and degree=='本科'}) | 相对当前单元格,取到所有绑定对象属性 age 大于 20 的 C1 单元格值以及绑定对象属性 salary 大于 2000 且 degree 属性等于本科的 C2 单元格的值进行求最小值 |
row 函数(取行号)
取当前单元格所在行的行号,这个函数比较简单,它没有参数。
| 示例 | 说明 |
|---|---|
| row() | 取当前单元格所在行的行号 |
column 函数(取列号)
取当前单元格所在列的列号,这个函数比较简单,它没有参数。
| 示例 | 说明 |
|---|---|
| column() | 取当前单元格所在列的列号 |
order 函数(排序)
order 函数需要两个参数,第一个为要进行排序的对象表达式,第二个是一个布尔值,用来设置排序方式,true 正序,false 为倒序。
| 示例 | 说明 |
|---|---|
| order(C1,false) | 相对当前单元格,取到所有 C1 单元格值,对这些值进行倒排序,返回排序好的结果集合 |
order(C1{age>18},true) | 相对当前单元格,取到与 C1 单元格绑定的对象属性 age 值大于 18 的所有 C1 单元格值,对这些值进行正排序,返回排序好的结果集合 |
list 函数(罗列数据)
取到表达式中定义所有数据,并以集合形式返回。
| 示例 | 说明 |
|---|---|
| list(C1) | 相对当前单元格,取到所有 C1 单元格值以集合形式返回 |
list(C1,C2{age>20}) | 相对当前单元格,取到所有 C1 单元格值及 C2 单元格中 age 属性大于 20 的所有 C2 单元格值以集合形式返回 |
param 函数(取参数)
param 函数用来获取外部传入的参数,它需要一个参数,用于指定要获取的参数名称。
| 示例 | 说明 |
|---|---|
| param("deptId") | 获取外部传入的名为 deptId 的参数值 |
| param(C1) | 相对于当前单元格,取到 C1 单元格的值,如果有多个 C1 单元格则么第一个,然后以这个 C1 单元格值作为参数名称,获取外部对应的参数值。 |
emptyparam 函数(判断参数是否为空)
emptyparam 函数用于判断指定的外部参数是否为 null 或空字符串,如果是返回 true,否则返回 false,该函数为 2.2.3 版本新增,如果要使用该函数,请注意您当前使用的 Luck-Report 版本。
emptyparam 函数一般用于 SQL 数据集 SQL 表达式里,比如下面的写法:
${
"select * from employee where 1=1 "+ (param("name")!=null && param("name")!="" ? ")
}上述的 SQL 判断采用的是 param 函数,由于要同时判断为 null 以及 "",写起来比较麻烦,如改用 emptyparam 函数就简单多了。
${
"select * from employee where 1=1 "+ (emptyparam("name")==false ? "and )
}formatdate 函数(格式化日期)
对给定的日期参数进行格式化,它至少需要一个参数,第一个参数是要格式化的日期类型的对象,第二个参数是可选的,用于定义格式化采用的模式,如不指定则用默认的:yyyy-MM-dd HH:mm:ss 来进行格式化。
| 示例 | 说明 |
|---|---|
| formatdate(C1) | 取到 C1 单元格值,这个值必须是日期类型,然后按 yyyy-MM-dd HH:mm:ss 来进行格式化成字符串输出 |
| formatdate(C1,"yyyyMMdd") | 取到 C1 单元格值,这个值必须是日期类型,然后按 yyyyMMdd 来进行格式化成字符串输出 |
formatnumber 函数(格式化数字)
对给定的参数进行格式化,它至少需要一个参数,第一个参数是要格式化的数字对象,要保证这个参数值取到后可以转换成日期,否则将发生错误;第二个参数是可选的,用于定义数字格式化采用的模式,如不定义,则采用默认的 #来进行格式化。
| 示例 | 说明 |
|---|---|
| formatnumber(C1) | 取到 C1 单元格值,这个值必须可以转换成数字,然后按 #来进行格式化成字符串输出 |
| formatnumber(C1,"#,###.00") | 取到 C1 单元格值,这个值必须可以转换成数字,然后按 #,###.00 来进行格式化成字符串输出 |
get 函数(获取指定位置数据)
get 函数是 2.1.2 版本中新增的,它的作用是获取数据集中指定位置的对象或对象的某个属性值。get 函数可以有三个参数,第一个为目标集合对象、第二个为数据位置、第三个是对象属性,其中第一个参数是必须的,后面两个参数为可选。
| 示例 | 说明 |
|---|---|
| get(ds1.select(employee_name)) | 从 ds1 数据集中获取第 1 个对象值,并将其返回。第二个位置参数没有指定默认取集合第一个对象 |
| get(ds1.select(employee_name),2) | 从 ds1 数据集中获取第 2 个对象值,并将其返回。 |
| get(ds1.select(employee_name),2,"deptId") | 从 ds1 数据集中获取第 2 个对象值,并从这个对象里取 deptId 属性值并返回。 |
| get(A3,4) | 获取所有 A3 单元格值,从中取第四个值并返回。 |
分页相关函数
所谓分页相关函数,是指这些函数是在分页的时候进行计算,比如计算当前页有多少条记录、当前页某个单元格值累加后是多少、平均值是多少、最大值是多少等等。
分页相关函数使用一般来说,分页相关函数多用在行类型为 “重复表头” 或“重复表尾”的行中的单元格里。同时,需要注意的是,分页相关函数只会在分页预览时显示,这点需要注意。
pcount 函数
统计当前页下表达对应值的数目,与 count 函数的使用方法基本一致,不同之处在于 pcount 只会统计当前页中对应的表达式内容的数目。
| 示例 | 说明 |
|---|---|
| pcount(C1) | 统计当前页中,C1 单元格数目 |
pcount(C1,D2{D2>10000}) | 统计当前页中,C1 单元格和当前页中所有 D2 单元格值大于 10000 的 D2 单元格数目 |
psum 函数
将当前页下表达式对应的所有值进行累加,与 sum 函数对应,不同的是 psum 只针对当前页。
| 示例 | 说明 |
|---|---|
| psum(C1) | 将当前页中,所有 C1 单元格值进行累加 |
psum(C1,D2{D2<10000}) | 将当前页中,所有 C1 单元格值以及值小于 10000 的 D2 单元格值累加起来 |
pmax 函数
比较当前页中,表达式对应的值,找出其中最大的那个值,与 max 函数对应,只是 pmax 只针对当前页。
| 示例 | 说明 |
|---|---|
| pmax(C1) | 比较当前页中所有 C1 单元格值,找出最大值。 |
pmax(C1,D2,E2{E2>1000}) | 比较当前页中,所有 C1、D2 以及值大于 1000 的 E2 单元格值,找出其中最大的。 |
pmin 函数
比较当前页中,表达式对应的值,找出其中最小的那个值,与 min 函数对应,只是 pmin 只针对当前页。
| 示例 | 说明 |
|---|---|
| pmin(C1) | 比较当前页中所有 C1 单元格值,找出最小值。 |
pmin(C1,D2,E2{E2>1000}) | 比较当前页中,所有 C1、D2 以及值大于 1000 的 E2 单元格值,找出其中最小的。 |
page 函数
输出当前所在页的页码,该函数没有参数。
| 示例 | 说明 |
|---|---|
| page() | 输出当前所在页的页码 |
pages 函数
输出当前报表一共有多少页,该函数没有参数。
| 示例 | 说明 |
|---|---|
| pages() | 输出当前报表一共有多少页 |
pages 函数的使用范围 pages 函数目前仅能在页眉页脚中使用
数学函数
abs 函数(绝对值)
求参数的绝对值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| abs(-233) | 求 - 233 绝对值,计算后的值是 233 |
| abs(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值返回其绝对值 |
ceil 函数(最小值)
对参数值取最小值,如果参数值为小数将舍弃小数点后面的小数部分,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| ceil(32.32) | 计算后值为 32 |
| ceil(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值返回其最小值 |
floor 函数(最大值)
对参数值取最大值,如果参数值为小数将四舍五入小数点后面的小数部分,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| floor(32.52) | 计算后值为 33 |
| floor(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值返回其最大值 |
chn 函数(数字转中文)
将一个数字转化成中文,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| chn(213) | 计算后的值为:贰佰壹拾叁 |
| chn(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再转化成中文 |
chn 函数使用注意事项 chn 函数转换数字即可是整数,也可是小数,如果是小数支持后面最多两位小数,如果实际小数过多,chn 函数会先进行四舍五入,然后再进行转换。
rmb 函数(数字转换为大写的人民币金额)
将一个数字转换成中文大写的人民币金额,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| rmb(213) | 计算后的值为:贰佰壹拾叁元整 |
| rmb(200.12) | 计算后的值为:贰佰元壹角贰分 |
| rmb(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再转化成中文大写的人民币金额 |
rmb 函数使用注意事项 rmb 函数转换数字即可是整数,也可是小数,如果是小数支持后面最多两位小数,如果实际小数过多,rmb 函数会先进行四舍五入,然后再进行转换。
cos 函数(求余弦)
求参数的余弦值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| cos (213) | 计算后的值为:0.8090276252864301 |
| cos(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其余弦值 |
sin 函数(正弦)
求参数的正弦值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| sin(213) | 计算后的值为:-0.58777 |
| sin(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其正弦值 |
tan 函数(正切)
求参数的正切值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| tan(213) | 计算后的值为:-0.72651 |
| tan(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其正切值 |
exp 函数(方法用于返回自然数底数 e 的参数次方)
求参数的自然数底数 e 的参数次方,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| expr(213) | 计算后的值为:3.196867565323994E921 |
| expr(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其自然数底数 e 的参数次方 |
log10 函数(返回以 10 为底的对数值)
求参数以 10 为底的对数值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| log10(213) | 计算后的值为:2.3283796034387376 |
| log10(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其以 10 为底的对数值 |
log 函数(自然对数)
求参数自然对数值,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| log(213) | 计算后的值为:5.3612921657094255 |
| log(C1) | 相对当前单元格,取到 C1 单元格的值,如果有多个则取第一个值,再求其自然对数值 |
median 函数(中位数)
求一组数据的中位数,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| median(12,42,31) | 运行结果为 31 |
| median(C1) | 相对当前单元格,取到 C1 单元格的所有值,再取这些值中位数 |
| median(C1,C2) | 相对当前单元格,取到 C1 单元格和 C2 单元格的所有值,再取这些值中位数 |
mode 函数(众数)
求一组数据的众数,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| mode(12,42,3,12) | 运行结果为 12 |
| mode(C1) | 相对当前单元格,取到 C1 单元格的所有值,再取这些值众数 |
| mode(C1,C2) | 相对当前单元格,取到 C1 单元格和 C2 单元格的所有值,再取这些值众数 |
vara 函数(方差)
求一组数据的方差,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| vara(12,42,3,12) | 运行结果为 209.25 |
| vara(C1) | 相对当前单元格,取到 C1 单元格的所有值,再取这些值方差 |
| vara(C1,C2) | 相对当前单元格,取到 C1 单元格和 C2 单元格的所有值,再取这些值方差 |
stdevp 函数(标准差)
求一组数据的标准差,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| stdevp(12,42,3,12) | 运行结果为 14.75424 |
| stdevp(C1) | 相对当前单元格,取到 C1 单元格的所有值,再取这些值标准差 |
| stdevp(C1,C2) | 相对当前单元格,取到 C1 单元格和 C2 单元格的所有值,再取这些值标准差 |
pow 函数(返回第一个参数的第二个参数次方)
pow 函数需要两个参数,第一个为需要计算的数字或表达式,第二个为具体的次方。
| 示例 | 说明 |
|---|---|
| pow(3,2) | 表示计算 3 的 2 次方值,运算后的结果为 9 |
| pow(C1,3) | 相对当前单元格,取到 C1 单元格的值,如果取到的 C1 单元格有多个,则取第一个,再对其值求 3 次方 |
random 函数(随机数)
生成一个随机数,可以有一个数字类型的参数或表达式,如果有参数,那么以这个参数作为生成随机数字的种子,如果没有则生成一个 0~1 之间的随机数。
| 示例 | 说明 |
|---|---|
| random() | 生成一个 0~1 之间的随机数 |
| random(10) | 生成一个 1~10 之间的随机数 |
| random(C1) | 相对当前单元格,取到 C1 单元格的值,如果取到的 C1 单元格有多个,则取第一个,再将这个值作为种子生成一个随机数 |
round 函数(四舍五入)
对一个小数进行四舍五入,它需要两个参数,第一个参数要进行四舍五入的小数或表达式,第二个为
一个可选的
要保留的小数位数,如果没有,则不保留小数。
| 示例 | 说明 |
|---|---|
| round(32.12) | 计算后的值为 32 |
| round(32.123,2) | 计算后的值为 32.12 |
| round(C1,2) | 相对当前单元格,取到 C1 单元格的值,如果取到的 C1 单元格有多个,则取第一个,然后对这个值做保留两位小数的四舍五入操作 |
sqrt 函数(平方根)
求一个数字或表达式计算后值的平方根,参数值计算后数据类型必须是数字,否则会报错。
| 示例 | 说明 |
|---|---|
| sqrt(2) | 计算后的值为:1.414214 |
| sqrt(C1) | 相对当前单元格,取到 C1 单元格的值,如果取到的 C1 单元格有多个,则取第一个,然后对这个值进行取平方根计算 |
日期函数
date 函数(日期)
输出日期,date 函数可以有一个参数,就是日期格式,如果没有则采用 yyyy-MM-dd HH:mm:ss 格式输出日期。
| 示例 | 日期 |
|---|---|
| date() | 以 yyyy-MM-dd HH:mm:ss 格式输出当前日期,如:2010-08-15 08:45:10 |
| date('yyyy 年 MM 月 dd 日') | 以 yyyy 年 MM 月 dd 日格式输出当前日期,如:2010 年 08 月 15 日 |
day 函数(天)
输出当前在月份中的天,该函数没有参数。
| 示例 | 说明 |
|---|---|
| day() | 可能输出 15,表示当前为 15 日 |
month 函数(月)
输出当前月份,该函数没有参数。
| 示例 | 说明 |
|---|---|
| month | 可能输出 8,表示当前为 8 月份 |
week 函数(星期)
输出当前是星期几,该函数没有参数。
| 示例 | 说明 |
|---|---|
| week() | 输出值可能是 "星期三",表示当前为星期三 |
year 函数(年)
输出当前年份,该函数没有参数
| 示例 | 说明 |
|---|---|
| year | 输出结果为 2010,表示当前为 2010 年 |
字符串函数
indexOf 函数 (位置)
用于返回一个字符串,在目标字符串中的位置,该函数至少需要两个参数,第一个为目标字符串,第二个为要查找的字符串,如果有三个参数,那么第三个就是开始查找的位置信息,第三个参数必须是一定大于等于 0 的数字。
| 示例 | 说明 |
|---|---|
| indexof('中华人民共和国','共和') | 表示要从 "中华人民共和国" 这个字符串中找到 "共和" 字符串的位置 |
| indexof('中华人民共和国','共和',2) | 表示要从 "中华人民共和国" 这个字符串中第二个字符开始始,找到 "共和" 字符串的位置 |
| indexof(C1,"人民",2) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,再从这个值中第 2 个位置开始找到 "人民" 字符串的位置 |
length 函数(长度)
求目标字符串长度,该函数必须要有一个参数。
| 示例 | 说明 |
|---|---|
| length("中华人民共和国") | 计算结果为 7 |
| length(C1) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后计算这个值长度 |
lower 函数(转小写)
将参数中英文全部转为小写,该函数必须要有一个参数。
| 示例 | 说明 |
|---|---|
| lower("Super man") | 计算后的结果为:super man |
| lower(C1) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后将这个值中所有英文转换成小写 |
upper 函数(转大写)
将参数中英文全部转为大写,该函数必须要有一个参数。
| 示例 | 说明 |
|---|---|
| upper("Super man") | 计算后的结果为:SUPER MAN |
| upper(C1) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后将这个值中所有英文转换成大写 |
replace 函数(替换字符串)
这个函数需要有三个参数,第一个是目标字符串,第二个是要被替换的字符串,第三个是要替换的字符串。
| 示例 | 说明 |
|---|---|
| replace("他是一个好人","他","她") | 计算结果为:她是一个好人 |
| replace(C1,"他","她") | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后再将这个值中所有 "他" 换成"她" |
substring 函数(子字符串)
该函数允许有三个参数,第一个是目标字符串,第二个为开始截取的位置,第三个为截取结束的位置。
| 示例 | 说明 |
|---|---|
| substring("他是一个好人",2) | 运行结果为:一个好人 |
| substring("他是一个好人",2,4) | 运行结果为:一个 |
| substring(C1,2,10) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后再取这个值中第 2 到第 10 个字符之间内容 |
trim 函数(去空格)
去除目标字符串两边空格,该函数要求必须要有一个参数。
| 示例 | 说明 |
|---|---|
| trim("一个好人") | 运行结果为: 一个好人 |
| trim(C1) | 相对于当前单元格,找到 C1 单元格,如果 C1 单元格有多个,则取第一个单元格值,然后再将这个值两边可能存在的空格全部去除 |
json 函数(解析 JSON 字符串)
json 函数是 2.1.3 版本新增的,该函数可以解析指定的目标 JSON 字符串,并取出指定的属性值。json 函数需要有两个参数,第一个是目标 JSON 字符串对象,第二个是要取出的属性名。
| 示例 | 说明 |
|---|---|
| json(emp.select(other),'name') | 取出数据集 emp 中 other 属性值对应的字符串,将其转换为 JSON,再从这个 JSON 中取 name 属性值。 |
| json(emp.select(other),'company.name') | 取出数据集 emp 中 other 属性值对应的字符串,将其转换为 JSON,再从这个 JSON 中取 company 子对象下的 name 属性值。 |
对 JSON 字符串的要求 json 函数在解析 JSON 字符串时,要求必须是标准的 JSON 字符串,比如下面这样的:{"name":"superman","age":32,"company":{"name":"bstek","address":"SHANGHAI CHINA"}}也就是 key 属性也需要用 “” 包裹的,如果是下面这种类型的 JSON 字符串就解析时就会产生错误:{name:"superman",age:32,company:{name:"bstek",address:"SHANGHAI CHINA"}}