本文共 2085 字,大约阅读时间需要 6 分钟。
在项目中,单元格中的数据是JSON格式,需要通过自定义函数完成提取。这一功能需求的实现需要处理多层级的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 上述示例展示了如何从复杂的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参数)解析流程:
返回值:
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/