博客
关于我
帆软报表自定义函数-取json数据
阅读量:613 次
发布时间:2019-03-12

本文共 2085 字,大约阅读时间需要 6 分钟。

帆软报表支持,自定义Java函数完成JSON数据提取

问题背景

在项目中,单元格中的数据是JSON格式,需要通过自定义函数完成提取。这一功能需求的实现需要处理多层级的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

上述示例展示了如何从复杂的JSON数据中提取需要的值。每个JSONVAL函数调用都支持路径参数,可以处理多层级结构。

技术实现

基于开源库Gson实现JSON解析和处理,将函数编写为MyEclipse插件的一部分。代码实现如下:

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;
}
}
return jsonEle.getAsString();
} catch (Exception e) {
return Primitive.ERROR_VALUE;
}
}
}

功能说明

  • 输入参数

    • jsonStr: 需要解析的JSON字符串
    • path: 提取路径(支持String和Integer参数)
  • 解析流程

    • 使用JsonParser解析jsonStr
    • 根据path逐级检索对应值
    • 支持多层级结构和数组索引
  • 返回值

    • 提取结果以字符串格式返回
    • 失败时返回Primitive.ERROR_VALUE
  • 示例应用

  • 提取嵌套对象中的字段:

    JSONVAL('{"message":"hello", "data":{"age":30}}', 'data', 'age') → 30
  • 从数组中选取特定索引的元素:

    JSONVAL('[1, 2, {"k1":"v1"}]', 1, 'k1') → v1
  • 处理混合类型数据:

    JSONVAL('{"isBoolean": true, "numberValue": 100, "_object": {"nestedKey":"value"}}', 'isBoolean') → true
  • 实施价值

    本实现基于开源库Gson,能够轻松支持JSON数据的快速解析和提取。通过自定义函数实现多层结构的数据提取,大大提升了报表处理的灵活性和效率,同时确保了数据的准确性和完整性。

    转载地址:http://roaxz.baihongyu.com/

    你可能感兴趣的文章
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    Numpy 入门
    查看>>
    NumPy 库详细介绍-ChatGPT4o作答
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>