帆软报表自定义函数-取json数据

谁践踏了优雅 2023-07-08 09:23 5阅读 0赞

帆软报表支持,写 Java 代码自定义函数,完成各种逻辑的取数。

最近遇到一个需求,单元格里的数据是 json 格式,希望通过自定义一个函数完成取数。

取数公式如:

  1. JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k1') -> v1
  2. JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k2', 0) -> v21
  3. JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k3', 'k31') -> v31
  4. JSONVAL('[1, "2", {"k1":"v1"}]', 2, 'k1') -> v1

Web 项目使用了 Gson 解析和生成 json 格式的数据,这里基于 Gson 实现。

代码如下:

  1. package com.fr.function;
  2. import com.fr.script.AbstractFunction;
  3. import com.fr.stable.Primitive;
  4. import com.google.gson.JsonArray;
  5. import com.google.gson.JsonElement;
  6. import com.google.gson.JsonObject;
  7. import com.google.gson.JsonParser;
  8. /**
  9. * 帆软json取数,支持多层级
  10. * 如:
  11. * JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k1') -> v1
  12. * JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k2', 0) -> v21
  13. * JSONVAL('{"k1":"v1", "k2":["v21", "v22"], "k3":{"k31":"v31"}}', 'k3', 'k31') -> v31
  14. * JSONVAL('[1, "2", {"k1":"v1"}]', 2, 'k1') -> v1
  15. * @author ConstXiong
  16. */
  17. public class JSONVAL extends AbstractFunction{
  18. private static final long serialVersionUID = 1L;
  19. @Override
  20. public Object run(Object[] arg) {
  21. int paramLength = arg.length;
  22. if (paramLength < 2 || arg[0] == null || arg[1] == null) {
  23. return Primitive.ERROR_NAME;
  24. }
  25. try {
  26. JsonParser parser = new JsonParser();
  27. JsonElement jsonEle = parser.parse(arg[0].toString());
  28. for (int i = 1; i < paramLength; i++) {
  29. if (jsonEle.isJsonObject() && arg[i] instanceof String) {
  30. jsonEle = ((JsonObject)jsonEle).get(arg[i].toString());
  31. } else if (jsonEle.isJsonArray() && arg[i] instanceof Integer) {
  32. jsonEle = ((JsonArray)jsonEle).get((Integer)arg[i]);
  33. } else {
  34. return Primitive.ERROR_VALUE;
  35. }
  36. }
  37. //此时 jsonEle 仍可能是 JsonObject 或 JsonArray,暂不处理
  38. return jsonEle.getAsString();
  39. } catch (Exception e) {
  40. return Primitive.ERROR_VALUE;
  41. }
  42. }
  43. }

使用如图:

format_png


【Java面试题与答案】整理推荐

  • 基础与语法
  • 集合
  • 网络编程
  • 并发编程
  • Web
  • 安全
  • 设计模式
  • 框架
  • 算法与数据结构
  • 异常
  • 文件解析与生成
  • Linux
  • MySQL
  • Oracle
  • Redis
  • Dubbo

发表评论

表情:
评论列表 (有 0 条评论,5人围观)

还没有评论,来说两句吧...

相关阅读

    相关 文本函数

    1. CHAR   CHAR(number):根据指定数字代码返回对应的字符。CHAR 函数可将计算机其他类型的数字代码转换为字符。 Number:用于指定字符的数字