本文共 1872 字,大约阅读时间需要 6 分钟。
帆软报表支持,写 Java 代码自定义函数,完成各种逻辑的取数。
最近遇到一个需求,单元格里的数据是 json 格式,希望通过自定义一个函数完成取数。
取数公式如:
JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k1') -> v1JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k2', 0) -> v21JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k3', 'k31') -> v31JSONVAL('[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; } } }
使用如图:
转载地址:http://roaxz.baihongyu.com/