【问题标题】:How to unmarshal JSON to multiple items with JBoss Fuse (camel)?如何使用 JBoss Fuse (camel) 将 JSON 解组为多个项目?
【发布时间】:2017-12-20 14:29:51
【问题描述】:

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

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

【问题讨论】:

    标签: java json jboss apache-camel jbossfuse


    【解决方案1】:

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

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

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

    【讨论】:

    • 表示 json() 方法不适用于 JacksonDataFormat。而 format.useList() 应该是 json.useList() ?
    • 是的,你写的,json是对象名,我会改正的
    【解决方案2】:

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

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

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

    如果您无法控制输入,您还可以在 Camel 处理过程中添加数组标记,就在 unmarshal() 调用之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2017-05-12
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多