如何使用 JBoss Fuse(骆驼)将 JSON 解组为多个项目?

How to unmarshal JSON to multiple items with JBoss Fuse (camel)?

我目前有以下简化的 JSON (test.json):

{"type":"monkey","food":"banana"},{"type":"dog","food":"bone"},{"type":"cat","food":"fish"}

正在执行以下操作:

from("file:/tmp/input").routeId("test")
                        .unmarshal().json(JsonLibrary.Jackson)
                        .log("After unmarshall:\n ${body}");

将 JSON 文件放入输入文件夹时,我只得到以下地图:

{type=monkey, food=banana}

如何将所有项目都放入映射中?

您尝试解析的 JSON 不是有效的 JSON。如果您可以控制发送给 Camel 的内容,请尝试将其包装在一个数组中,如下所示:

[{"type":"monkey","food":"banana"},{"type":"dog","food":"bone"},{"type":"cat","food":"fish"}]

这将为您提供一组对象并且应该正确解析。

如果您无法控制输入,也可以在 unmarshal() 调用

之前添加数组标记作为 Camel 处理的一部分

如果你想得到所有的,然后把它们放到一个数组中,比如

[{"type":"monkey","food":"banana"},{"type":"dog","food":"bone"},{"type":"cat","food":"fish"}]

然后使用 useList 选项设置 dataFormat 为真。在 Xml 中,我尝试的 DSL 是

<dataFormats>
  <json id="json" library="Jackson"  useList="true"/>
</dataFormats>

在Java是

JacksonDataFormat json = new JacksonDataFormat(); 
json.useList();

然后对前面的数据格式使用unmarshall

XML DSL:

<unmarshal ref="json"/>

所以你应该有:

from("file:/tmp/input").routeId("test")
                        .unmarshal().json(json)
                        .log("After unmarshall:\n ${body}");

输出是一个列表:

 [{type=monkey, food=banana}, {type=dog, food=bone}, {type=cat, food=fish}]