【问题标题】:Extract all particular field from JSON in mule esb从 mule esb 中的 JSON 中提取所有特定字段
【发布时间】:2015-03-17 13:11:41
【问题描述】:

我有这个 json 有效负载,我想一次性收集所有 externalListingId -

{
"listings": {
    "numFound": 3,
    "listing": [
        {
            "status": "INACTIVE",
            "pricePerTicket": {
                "amount": 100,
                "currency": "USD",
            },
            "paymentType": "1",
            "externalListingId": "12208278",
            "city": "New York"
        },
        {   "status": "ACTIVE",
            "pricePerTicket": {
                "amount": 4444,
                "currency": "USD"
            },
            "paymentType": "1",
            "externalListingId": "CID1421798897102:151681733",
            "city": "Seattle"
        }
      ]
   }
}

我正在使用 MVEL 表达式 -

<enricher target="#[flowVars['sData']]" source="#[(externalListingId in payload.listing)]" doc:name="Message Enricher">
    <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
    </enricher>

但这会出错! - 消息负载类型:ReleasingInputStream。

场景 - 我想将所有 externalListingId 收集到 flowVariable 中,转换为 hashmap。我有另一个 CSV 文件作为输入,想遍历该有效负载并检查此地图是否包含 id!

我正在关注这个较早的帖子 - Extracting array from JSON in mule esb

【问题讨论】:

    标签: json groovy mule mule-studio mvel


    【解决方案1】:

    您需要将消息的流式负载转换为对象:

    <json:json-to-object-transformer returnClass="java.lang.Object" />
    

    enricher 之前,删除你在其中的那个。

    您还需要修复您的 MEL,因为其中缺少 listings 属性:

    source="#[(externalListingId in payload.listings.listing)]"
    

    来源:http://www.mulesoft.org/documentation/display/current/Mule+Expression+Language+Tips#MuleExpressionLanguageTips-JSONProcessing

    【讨论】:

    • 在丰富器之前将 json 添加到对象转换器后,我收到错误 - 消息负载类型 LinkedHashMap,我想我不能再使用 MVEL 表达式来收集所有 externalListingId
    • 对不起,我忘了告诉你从enricher 中移除变压器。而且,不,您完全可以使用 MEL 来收集值,这就是进行 JSON 转换的重点。您的 MEL 实际上有问题。我已经编辑了我的答案。
    • 太棒了!让它工作。在表达式过滤器中,我正在检查#[flowVars['sData'].contains(payload.TicketID)]。我实际上想要如果不包含则继续条件
    【解决方案2】:

    它使用相同的定义。

    <flow name="test-mule-json-extractFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/json" doc:name="HTTP"/> <enricher source="#[(externalListingId in payload.listings.listing)]" target="#[flowVars.ids]" doc:name="Message Enricher"> <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/> </enricher> <logger message=":::::::::::::::#[flowVars.ids]" level="INFO" doc:name="Logger"/> </flow>

    注意:您提到的 json 输入由于有额外的逗号而无效。

    【讨论】:

    • enricher 后面的消息负载类型是什么?是Map 还是InputStream?如果是流,则它已被消耗并且无用。无论如何,在enricher 之前进行转换以明确什么是新的有效负载类型会更清楚。无论如何,我很想知道:enricher 之后的有效负载类型是什么?
    • 嗨,David,enricher 之后的有效负载类型是 BufferInputStream。
    • 谢谢莫汉。所以它会被enricher 内的变压器消耗掉,从而变得无用(使用它会引发异常)。因此,我仍然建议将变压器放置在enricher 之前,这样有效负载就变成了Map 并且仍然可用。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2017-01-06
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多