怎样用 esProc 计算来自 Restful 的多层 json 数据

简介: esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。

接收 Restful 的 json 数据后经常还要计算,用 Java 处理会比较麻烦。用 esProc 会简单很多,不仅能对接 Restful 接口,擅长处理多层数据,还能嵌入 Java 应用使用,可以作为应用内计算引擎使用。

可以先到乾学院下载 esProc 标准版,它是免费的。

安装完成后,先尝试一下访问 Restful 数据。

Restful 访问
直接访问
Rest 服务提供各种数据访问接口,比如访问:http://192.168.2.52:8503/orders可以获得订单数据:

接收 Restful 的 json 数据后经常还要计算,用 Java 处理会比较麻烦。用 esProc 会简单很多,不仅能对接 Restful 接口,擅长处理多层数据,还能嵌入 Java 应用使用,可以作为应用内计算引擎使用。

先到https://www.esproc.com/download-esproc/ 下载 esProc 标准版。

安装完成后,先尝试一下访问 Restful 数据。

Restful 访问
直接访问
Rest 服务提供各种数据访问接口,比如访问:http://192.168.2.52:8503/orders可以获得订单数据:
f60ecd3bc23d0244c073fdd6ae01f21b_1744783207667100.png

Orders 采用多层 json 存储了订单产品等相关信息,结构如下:

[
  {
   
    "order_id": "ORD001",
    "order_date": "2025-03-01",
    "customer": "Alice Johnson",
    "order_details": [
      {
   
        "detail_id": "D001",
        "quantity": 2,
        "price": 50.0,
        "product": {
   
          "product_id": "P001",
          "name": "Wireless Mouse",
          "category": "Electronics"
        }
      },
      {
   
        "detail_id": "D002",
        "quantity": 1,
        "price": 120.0,
        "product": {
   
          "product_id": "P002",
          "name": "Mechanical Keyboard",
          "category": "Electronics"
        }
      }
    ]
  },
  {
   
    "order_id": "ORD002",
    "order_date": "2025-03-02",
    "customer": "Bob Smith",
    "order_details": [
      {
   
        "detail_id": "D003",
        "quantity": 3,
        "price": 25.0,
        "product": {
   
          "product_id": "P003",
          "name": "Bluetooth Headphones",
          "category": "Electronics"
        }
      },
      {
   
        "detail_id": "D004",
        "quantity": 1,
        "price": 200.0,
        "product": {
   
          "product_id": "P004",
          "name": "Smart Watch",
          "category": "Wearables"
        }
      }
    ]
  },]

编写 esProc 脚本访问 orders 数据:

QQ_1744881897424.png

这里使用 httpfile 函数访问 Restful 服务读取 order 数据,A2 使用 json 函数将 json 串转成二维序表。

按 ctrl+F9 运行脚本:

949bcc4e14aff026fe1b9a702af8128d_1744783207794100.png

可以正常访问。这里使用 httpfile 函数访问 Restful 服务读取 order 数据,然后 A2 使用 json 函数将 json 串转成二维序表。

下面做一个计算:筛选包含某个分类(如 Electronics),且订单金额不低于 200 的订单。

设置脚本参数:

f6b11f466fc6268251be840dfcd4c4e2_1744783207937100.png

编写脚本:

QQ_1744881935697.png

A3 进行条件过滤,这里直接用点(.)操作符引用下一层级的数据,多层就直接点下去就可以,表达很清晰。

执行可以看到各步骤运行结果:

image.png

还可以写成一句:

=json(httpfile("http://172.20.10.7:8503/orders").read()).select(order_details.select@1(product.category==categ) && order_details.sum(price*quantity)>200). new(order_id,order_date,customer,order_details.sum(price*quantity):amount)

值得一提的是,这种任务即使用支持 json 较好的 DuckDB SQL 也不好算(先不考虑访问 Restful 服务的复杂度):

SELECT
    o.order_id, 
    LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics') AS order_details
FROM read_json_auto(orders.json') AS o
WHERE 
    ARRAY_LENGTH(LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics')) > 0
    AND SUM(
        LIST_FILTER(o.order_details, x -> x.product.category = 'Electronics') -> 
            (x -> x.price * x.quantity)
) > 200;

相比之下 esProc 就简单多了,而且还能非常方便地访问 Restful 服务。

安全控制
为了数据的安全性,有些 REST 服务器会对访问数据者的身份进行认证,只有通过认证的访问才能读取到数据。常用的身份认证分为两大类,一类是用户访问认证页面后,服务器将认证后的信息记录在 Session 并将 Session 号发回客户端的 Cookie 中,或者将认证信息也发回客户端的 Cookie 中。当要访问有权限控制的页面数据时,需要将 Cookie 中保存的内容放在申请头中,服务器就能判断出访问者的身份,从而决定是否允许访问此页数据。另一类是用户访问认证页面后,服务器返回一个访问令牌 Token,在令牌有效期内,访问有权限控制页面数据时将 Token 作为参数传回就可以了。

这里给出两个示例。

服务器以 Session 或 Cookie 保存身份认证
QQ_1744882009943.png

服务器返回 Token
QQ_1744882023057.png

应用集成
下面把 esProc 集成到 Java 应用中。

从 [esProc 安装目录]\esProc\lib 目录下找到 esProc JDBC 相关的 jar 包:esproc-bin-xxxx.jar、icu4j_60.3.jar。
5712126a1dd5db9ca4fd8be3114b48af_1744783207403100.png

将这两个 jar 包部署到 Java 开发环境的类路径下,同时将 MySQL 的驱动包也放到应用中。

再从目录 [esProc 安装目录]\esProc\config 下找到 esProc 配置文件 raqsoftConfig.xml,同样部署到 Java 开发环境的类路径下。

编写 Java 代码调用 SPL 脚本 getRestData.splx:

public class RestDataQuery {
   
    public static void main(String[] args) {
   
        String driver = "com.esproc.jdbc.InternalDriver";
        String url = "jdbc:esproc:local://";
        try {
   
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url);
            PreparedStatement st =conn.prepareCall("call getRestData(?)");
            st.setObject(1, "Electronics");
            st.execute();
            ResultSet rs = st.getResultSet();
            System.out.println("order_id\torder_date\t\tcustomer\t\tamount");
            System.out.println("----------------------------------------------");
            while(rs.next()) {
   
                String orderId = rs.getString("order_id");
                String orderDate = rs.getString("order_date");
                String customer = rs.getString("customer");
                double amount = rs.getDouble("amount");
                System.out.printf("%-15s%-15s%-15s%.2f%n",orderId, orderDate, customer, amount);
            }
        } catch (Exception e) {
   
            throw new RuntimeException(e);
        }
    }
}

JDBC 的使用跟数据库完全一致,调用 SPL 脚本也与访问存储过程类似,这里是 call getRestData (?) 并传参。

下面是运行结果:

f296952a6dae16ecf8c6c2c4b76e363e_1744783207542100.png

总结一下,用 esProc 处理 Restful 接口的 json 数据,既能简化多层结构的解析和计算,又能轻松嵌入 Java 程序,可作为应用内计算引擎使用。

相关文章
|
2月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
2月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
137 0
|
2月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
71 0
|
24天前
|
XML JSON API
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
|
25天前
|
JSON JavaScript 前端开发
如何在 Postman 中发送 JSON 数据
我们将深入探讨使用 Postman 发送 JSON 数据这一主题,Postman 是一款强大的 API 测试和开发工具。无论您是经验丰富的开发人员还是新手,掌握这项技能对于高效的 API 测试和开发都至关重要。
|
1月前
|
JSON JavaScript 数据格式
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
96 1
|
2月前
|
存储 JSON API
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:
|
2月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
116 0
|
3月前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
187 83
|
2月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
210 4
JSON数据解析实战:从嵌套结构到结构化表格