1. 概述
1.1 版本
报表服务器版本 | JSON数据集插件 |
---|---|
11.0 | V9.5.7 |
11.0.8 | V9.5.8 |
11.0.10 | V9.5.9 |
1.2 应用场景
随着 JavaScript 的流行,JSON 格式的数据也被越来越广泛的使用。使用 JSON 数据集插件可以将 JSON 格式的数据转变为报表中可以使用的数据表。
1.3 语法规则
JSON 查询的详细语法规则参见文档:JsonPath
注:JsonPath语法内写参数的方法,与普通数据集一致。
1.4 方案对比
对比项 | 当前方案 | 新方案 | ||||
---|---|---|---|---|---|---|
方案简介 | 本文方法,在 FineReport 中下载「JSON 数据集」插件实现 | 本文不做介绍 使用 FineDataLink 产品 中的「JSON 解析」算子实现 | ||||
主要实现过程 | 需要提前学习 JSON 查询的语法 创建 JSON 数据集后,输入查询语句,取出数据
| 「JSON 解析」算子中,无需输入查询语句,直接可视化选择节点即可
|
2. 安装插件
3. JSON数据集
3.1 定义 JSON 数据连接
安装插件后,设计器菜单栏选择服务器>定义数据连接,新建一个 JSON 数据连接,命名为 JSON 。
输入链接地址http://fine-doc.oss-cn-shanghai.aliyuncs.com/book.json,并按如下图所示配置好其他设置项,点击「确定」。如下图所示:
注:请求地址返回的文本信息,只要是 JSON 格式的文本即可。
设置项的详细说明如下图所示:
设置项 | 含义 |
---|---|
地址 | 用于输入json文本的请求地址(支持 HTTP 和非自签名 SSL 证书的 HTTPS) 地址支持参数,和数据集一样,注意提供一个默认参数供设计的时候查询用; 地址支持除报表函数和单元格计算以外的所有公式; 注:建议用户获取参数时使用单纯的接口链接,「 .json 文件」形式不能传参。 |
用户名密码 | 用于输入认证信息,允许为空,仅支持Authorization:Basic Base64(username:password)形式的认证 |
缓存有效期 | 用于设置缓存的有效期,单位毫秒,默认为0,表示不缓存; 设置缓存时间后,将在首次连接后进行缓存(支持集群),缓存有效期内读取的结果均为缓存内容,不随请求接口数据变化而变化 |
请求类型 | 用来设置不同的请求类型,并根据不同的请求类型进行传参设置 请求类型默认为 GET,可修改为 POST_FROM 及 POST_RAW ,关于请求类型的介绍可参见本文 3.3 节。 |
普通参数 | 普通参数即放在 Body 中的,通常说的 GET 和 POST 即普通参数 普通参数支持参数的增删改,并可通过刷新按钮直接刷新出请求地址中设置的参数(此时将用刷新出的参数覆盖原有的参数设置) |
头参数 | 头参数即放在 Header 中,常用不变的量一般都是走 header, 因为每次请求都带 header 请求头参数仅支持手动增删改,公式支持除报表函数和单元格计算以外的所有公式 |
编码 | 如果文件是非 UTF-8 编码的,就需要在原始编码这一栏选择对应的编码,否则无法正确的解析文本信息 |
注1:V9.3.3 版本的插件,脚本引擎支持自主选择 JavaScript V8 或者 Java(默认),在无法支持 JavaScript V8 的机器上自动使用 Java 版本的脚本引擎。
注2:添加参数类型取决于用户服务器需要接收什么类型的参数。
3.2 JSON数据集取数
设计器新建 JSON 数据集,如下图所示:
3.2.1 取出所有数据
点击新建好的 JSON 数据集编辑按钮,输入查询语句,即可获取到 JSON 中的数据。查询语句栏输入$.store.book[*],查询出书店中所有的书信息,如下图所示:
注:$.store.book[*] 是 JSON 的固定引用方式,代表取出 store 下 book 的全部数据。
点击「预览」按钮,查看取出来的 JSON 数据。
键排序:是指对获取出来的列名做排序,默认即为不开启(如果是不完整的json结构,需要同时开启预读列名才有效)
预读列名:先遍历所有的数据,把列名获取出来,可用于 JSON 结构不整齐的情况,会稍微的降低效率。默认即为不开启。
3.2.2 取其中某一列
查询语句栏输入$.store.book[*].category,取出 category 列的数据。
点击预览按钮,查看取出来的 JSON 数据。
3.2.3 条件取数
查询语句栏输入$.store.book[?(@.price<10)]取出价格小于 10 的书籍。
点击预览按钮,查看取出来的 JSON 数据。
注1:键值对顺序不一致可能造成数据错乱,可以开启预读列名。
注2:已完成模板参见下面的 JSON 数据集示例1.cpt。
3.3 传参方式介绍
传参方式区别
模式 | 传递方式 |
---|---|
GET | 拼接到 URL 上 |
POST_FORM | 需要传的是 key-value,可以添加动态参数 |
POST_RAW | 只要 value 就可以了,可以添加动态参数 |
注1:建议用户获取参数时地址使用单纯的接口链接,「 .json 」文件形式不支持传参。
注2:在决策报表中,如果希望JSON数据连接和控件联动,必须在JSON数据集中添加和JSON数据连接中同名的参数(即使用不上这个参数)。
注3:JSON数据集传参,参数值必须为固定值,而不可以是另一个参数,例如fine_username等。
3.3.1 GET 传参
创建 json 连接,请求类型选择「GET」,在 json 文本的请求地址后面加上添加参数,如下图所示:
添加「json」数据集,输入查询语句,返回参数 book 对应的数据,如下图所示:
3.3.3 POST_FORM 传参
创建 JSON 数据连接,请求类型选择「POST_FORM」。在地址处输入对应的 json 文本接口链接,并手动添加普通参数。如下图所示:
添加「json」数据集,输入查询语句,返回参数 book 对应的数据,如下图所示:
3.3.4 POST_RAW 传参
由于 POST_RAW 传参需要手动指定参数,所以在请求头参数中,设置 Content-Type 为 application/json ,表示客户端告诉服务器实际发送的数据类型为 JSON 格式。
创建 JSON 数据连接,请求类型选择「POST_RAW」。在地址处输入对应的 json 文本接口链接。如下图所示:
预览时,返回参数 book 对应的数据,如下图所示:
使用动态参数时,通过 ${} 进行动态传参,点击刷新按钮进行参数配置:
4. JSON程序数据集
使用 JavaScript 脚本,将 JSON 对象转换为二维表。这种方式可以解决所有不能直接用 JSON 数据集的场景,可以根据用户自己的数据结构定制脚本,从而实现和报表的对接。
注: 新建和使用 JSON 程序数据集,设计器需要使用 2019-03-13 及以后版本的 JAR 包,插件需要更新到 9.2.3 及以后版本。
4.1 新建JSON程序数据集
设计器中新建 JSON 程序数据集,如下图所示:
4.2 取出所有数据
点击新建好的 JSON 数据集编辑按钮,输入下图中的脚本代码,即可获取所有书籍的数据。
脚本代码:
var books = $.store.book;
var rowCount = books.length;
console.log("行数为:" + rowCount);
var table = [];
var column = [];
books.forEach(function(value, index) {
var row = [];
for (var key in value) {
row.push(value[key]);
column.push(key);
}
console.log("该行共有" + row.length + "列");
table.push(row);
});
return merge(table, unique(column))
点击预览按钮,查看取出来的 JSON 数据。
脚本中内置函数和变量的说明如下表所示:
内置函数和变量 | 含义 |
---|---|
$ | 表示 JSON 内容的对象 |
unique(array) | 将数组进行去重,主要用于列名处理 |
console.log(info) | 输出调试信息,会在日志文件中输出 INFO 级别的信息 |
console.error(err) | 输出错误级别的信息,会在日志文件中输出 ERROR 级别的信息 |
merge(table, column) | 合并数据集的内容和列名对象 |
books.forEach | JS 遍历数组方法 |
4.3 条件取数
脚本编辑框中如下脚本代码,取出价格小于 10 的书籍数据。
var books = $.store.book;
var rowCount = books.length;
var table = [];
var column = [];
books.forEach(function(value, index) {
var row = [];
if (value.price < 10) {
for (var key in value) {
row.push(value[key]);
column.push(key);
}
table.push(row);
}
});
return merge(table, unique(column));
点击预览按钮,查看取出来的 JSON 数据。
4.4 取出其中某一列
脚本编辑框中如下脚本代码,取出所有书籍的作者集合。
var books = $.store.book;
var rowCount = books.length;
var table = [];
var column = ["author"];
books.forEach(function(value, index) {
var row = [];
row.push(value.author);
table.push(row);
});
return merge(table, column);
点击预览按钮,查看取出来的 JSON 数据。
注:已完成模板参见下面的 JSON数据集示例2.cpt。
5. 效果预览
JSON数据集示例1.cpt:
JSON数据集示例2.cpt:
注:PC 及其移动端效果一致,可依据实际需求选择对应的数据集。