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

时间:2017-12-20 14:29:52

标签: java json jboss apache-camel jbossfuse

我目前有以下简化的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}

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

2 个答案:

答案 0 :(得分:3)

如果你想得到所有,那么把它们放到像

这样的数组中
[{"type":"monkey","food":"banana"},{"type":"dog","food":"bone"},{"type":"cat","food":"fish"}]

然后使用 useList 选项设置dataFormat为true。在我试过的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}]

答案 1 :(得分:0)

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

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

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

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

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