帆软报表自定义函数-取json数据
帆软报表支持,写 Java 代码自定义函数,完成各种逻辑的取数。
最近遇到一个需求,单元格里的数据是 json 格式,希望通过自定义一个函数完成取数。
取数公式如:
JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k1') -> v1
JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k2', 0) -> v21
JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k3', 'k31') -> v31
JSONVAL('[1, "2", {"k1":"v1"}]', 2, 'k1') -> v1
Web 项目使用了 Gson 解析和生成 json 格式的数据,这里基于 Gson 实现。
代码如下:
package com.fr.function;
import com.fr.script.AbstractFunction;
import com.fr.stable.Primitive;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* 帆软json取数,支持多层级
* 如:
* JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k1') -> v1
* JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k2', 0) -> v21
* JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k3', 'k31') -> v31
* JSONVAL('[1, "2", {"k1":"v1"}]', 2, 'k1') -> v1
* @author ConstXiong
*/
public class JSONVAL extends AbstractFunction{
private static final long serialVersionUID = 1L;
@Override
public Object run(Object[] arg) {
int paramLength = arg.length;
if (paramLength < 2 || arg[0] == null || arg[1] == null) {
return Primitive.ERROR_NAME;
}
try {
JsonParser parser = new JsonParser();
JsonElement jsonEle = parser.parse(arg[0].toString());
for (int i = 1; i < paramLength; i++) {
if (jsonEle.isJsonObject() && arg[i] instanceof String) {
jsonEle = ((JsonObject)jsonEle).get(arg[i].toString());
} else if (jsonEle.isJsonArray() && arg[i] instanceof Integer) {
jsonEle = ((JsonArray)jsonEle).get((Integer)arg[i]);
} else {
return Primitive.ERROR_VALUE;
}
}
//此时 jsonEle 仍可能是 JsonObject 或 JsonArray,暂不处理
return jsonEle.getAsString();
} catch (Exception e) {
return Primitive.ERROR_VALUE;
}
}
}
使用如图:
【Java面试题与答案】整理推荐
- 基础与语法
- 集合
- 网络编程
- 并发编程
- Web
- 安全
- 设计模式
- 框架
- 算法与数据结构
- 异常
- 文件解析与生成
- Linux
- MySQL
- Oracle
- Redis
- Dubbo
还没有评论,来说两句吧...