You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Siddhi作为库使用时,如何向InputHandler传入非硬编码及JSON数据?

向Siddhi InputHandler传入JSON数据的实用方法

嘿,我刚好折腾过Siddhi作为库使用时传入JSON数据的场景,给你分享几个实用的方法,不用再写硬编码的Object数组:

方法1:在Java代码中解析JSON,组装成匹配流结构的Object数组

这是最直接的方式,先把JSON字符串解析成对应的数据类型,再传给InputHandler.send()。需要用到JSON解析库(比如Jackson),步骤如下:

// 假设你的Siddhi流定义是:
// define stream StockStream (symbol string, price float, volume long);

// 1. 待传入的JSON数据
String jsonData = "{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300}";

// 2. 用Jackson解析JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonData);

// 3. 提取字段并组装成和流结构匹配的Object数组
String symbol = jsonNode.get("symbol").asText();
float price = jsonNode.get("price").floatValue();
long volume = jsonNode.get("volume").longValue();

// 4. 发送到InputHandler
inputHandler.send(new Object[]{symbol, price, volume});

注意:一定要保证解析后的字段类型和Siddhi流定义的类型完全一致,比如流里定义的是float,就不能传double,否则会触发类型不匹配的错误。

方法2:利用Siddhi内置JSON函数,直接传入JSON字符串

如果不想在Java代码里处理JSON解析,可以把JSON字符串作为单个字段传入流,然后在Siddhi查询里用内置的JSON函数解析。这种方式更灵活,适合JSON结构可能变动的场景:

// 定义带JSON载荷的输入流,以及解析查询
String siddhiApp = "" +
        "@app:name('StockJsonApp')\n" +
        "define stream StockJsonStream (jsonPayload string);\n" +
        "@info(name='ParseJsonQuery')\n" +
        "from StockJsonStream\n" +
        "select json:getString(jsonPayload, '$.symbol') as symbol,\n" +
        "       json:getFloat(jsonPayload, '$.price') as price,\n" +
        "       json:getLong(jsonPayload, '$.volume') as volume\n" +
        "insert into StockStream;\n";

// 初始化Siddhi运行时和InputHandler
SiddhiManager siddhiManager = new SiddhiManager();
SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp);
InputHandler inputHandler = siddhiAppRuntime.getInputHandler("StockJsonStream");

// 直接传入JSON字符串
String jsonData = "{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300}";
inputHandler.send(new Object[]{jsonData});

注意:要确保你的项目依赖里包含了Siddhi的JSON扩展包(比如siddhi-extension-json),否则json:*函数会无法使用。

方法3:批量传入JSON数组数据

如果需要一次性传入多条JSON数据,可以先解析JSON数组,批量组装成Object数组后,用InputHandler.send(Object[][] events)方法批量发送:

// 待传入的JSON数组
String jsonArray = "[{\"symbol\":\"WSO2\",\"price\":50.5,\"volume\":300},{\"symbol\":\"IBM\",\"price\":120.0,\"volume\":500}]";

// 解析JSON数组
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonArray);
List<Object[]> eventList = new ArrayList<>();

// 遍历数组,组装每个事件的Object数组
for (JsonNode node : jsonNode) {
    String symbol = node.get("symbol").asText();
    float price = node.get("price").floatValue();
    long volume = node.get("volume").longValue();
    eventList.add(new Object[]{symbol, price, volume});
}

// 批量发送事件
inputHandler.send(eventList.toArray(new Object[0][]));

这些方法都能帮你摆脱硬编码的Object数组,灵活传入JSON数据到Siddhi的InputHandler里。

内容的提问来源于stack exchange,提问作者duke390

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:07