帆软报表支持写 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;    }  }
}

 

使用如图:

图片




记录编码实践...


更多相关文章

  1. bootstrap高亮显示代码,且横向滚动
  2. 面试官:如何实现一个乐观锁(小白都能看得懂的代码)
  3. java8中的一个骚操作-方法引用(使代码看起来很高大上)
  4. 戴耳机敲代码,我都听些啥?
  5. GitHub还真把所有代码埋到北极地下了,我特么bug都还没改呢 ...
  6. 如何解决Renault Can Clip代码不正确的问题?
  7. 如何合理的设计代码分层,论代码分层的设计之道
  8. 数字签名的原理是什么?这篇文章给你答案(java代码实现)

随机推荐

  1. Android安全机制概述
  2. This Android(安卓)SDK requires Android
  3. Android SDK安装方法
  4. Android:shape的使用详解(1)
  5. Android Studio的Gradle文件方法说明
  6. Windows7下使用Eclipse搭建Cocos2dx+Andr
  7. Android核心入门分析
  8. 获取Android SDK 源代码并在Eclipse中关
  9. Android(安卓)Activity 之 startActivity
  10. Android重温