【问题标题】:Mule ESB: Can not de-reference JSON object arrayMule ESB:无法取消引用 JSON 对象数组
【发布时间】:2014-07-18 21:23:49
【问题描述】:

我有一个返回以下 JSON 对象的流程:

[{"1":444}]

“1”代表 select sum() 语句中的数据库行。

这是一个不寻常的 JSON 对象,在 JSONPath 中取消引用 444 的值的不寻常方法如下:

$.[0].1 

这是我用来打印整个 JSON 对象的流程:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
    <db:generic-config name="Generic_Database_Configuration" url="jdbc:db2://localhost:50000/TEST:user=instuid;password=instpw;" driverClassName="com.ibm.db2.jcc.DB2Driver" doc:name="Generic Database Configuration"/>
    <flow name="test2Flow1" doc:name="test2Flow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
        <db:select config-ref="Generic_Database_Configuration" doc:name="Database" doc:description="test">
            <db:parameterized-query><![CDATA[SELECT SUM(BALANCE) FROM BENCHMARKING.ACCOUNT]]></db:parameterized-query>
        </db:select>
        <response>
            <set-payload value="#['---&gt;  , payload: ' + payload]" doc:name="Set Payload"/>
        </response>
        <json:object-to-json-transformer doc:name="Object to JSON"/>
    </flow>
</mule>

所以我使用下面的 SetPayload 表达式,得到如下结果:

#['--->  , payload: ' + payload]


C:\curl>curl http://localhost:8081
--->  , payload: [{"1":444}]
C:\curl>

所以现在我想简单地提取值 444。所以我想我需要做一些类似于 JSONPath 语句的事情

$.[0].1 

所以我尝试以下 SetPayload 表达式并得到以下结果:

#['--->  , payload: ' + payload.[0].1]


C:\curl>curl http://localhost:8081
[Error: unbalanced braces { ... }]
[Near : {... '--->  , payload: ' + payload.[0].1 ....}]
                                            ^
[Line: 1, Column: 32] (org.mule.api.expression.InvalidExpressionException). Mess
age payload is of type: String

好的,这是有道理的,所以我再试一次:

#['--->  , payload: ' + payload.\1330\135.1]

C:\curl>curl http://localhost:8081
[Error: unexpected end of statement]
[Near : {... '--->  , payload: ' + payload.\1330\135.1 ....}]
                                   ^
[Line: 1, Column: 23] (org.mule.api.expression.InvalidExpressionException). Mess
age payload is of type: String

那么我该如何编写这个 SetPayload 表达式,以便在给定 JSON 对象的情况下返回 444 的值

[{"1":444}]

谢谢

编辑

我改变了我的流程如下:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
    <db:generic-config name="Generic_Database_Configuration" url="jdbc:db2://localhost:50000/TEST:user=instuid;password=instpw;" driverClassName="com.ibm.db2.jcc.DB2Driver" doc:name="Generic Database Configuration"/>
    <flow name="test2Flow1" doc:name="test2Flow1">
            <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" path="mule/getBalance"/>
        <db:select config-ref="Generic_Database_Configuration" doc:name="FB Database" doc:description="test">
            <db:parameterized-query><![CDATA[SELECT SUM(BALANCE) FROM BENCHMARKING.ACCOUNT]]></db:parameterized-query>
        </db:select>
        <set-payload value="#[message.payload[0]['1']]" doc:name="Set Payload"/>
        <json:json-to-object-transformer doc:name="JSON to Object"/>
    </flow>
</mule>

但是,我得到以下输出:

C:\curl>curl http://localhost:8081/mule/getBalance
¼φ ♣sr ↔org.mule.module.json.JsonDataZ╫♦♠╓▀☺┤☻ ☺L ♦nodet ▼Lorg/codehaus/jackson/
JsonNode;xp{sr  java.io.NotSerializableException(Vx τå▬5☻  xr ↔java.io.ObjectStr
eamExceptiond├Σkì9√▀☻  xr ‼java.io.IOExceptionlÇsde%≡½☻  xr ‼java.lang.Exception
detailMessaget ↕Ljava/lang/String;[ 5'9w╕╦♥ ♥L ♣causet §Ljava/lang/Throwable;L
stackTracet ▲[Ljava/lang/StackTraceElement;xpq t !org.codehaus.jackson.node.IntN
odeur ▲[Ljava.lang.StackTraceElement;☻F*<<²"9☻  xp    sr ←java.lang.StackTraceEl
ementa  ┼Ü&6▌à☻ ♦I
lineNumberL ♫declaringClassq ~ ♠LfileNameq ~ ♠L
methodNameq ~ ♠xp  ♦ìt →java.io.ObjectOutputStreamt ↨ObjectOutputStream.javat ♀w
riteObject0sq ~ ♀  ♣εt →java.io.ObjectOutputStreamt ↨ObjectOutputStream.javat ↕d
...

【问题讨论】:

    标签: json mule esb jsonpath


    【解决方案1】:

    用途:

    <set-payload value="#[message.payload[0]['1']]" />
    

    获取 JSON 数组中的第一个对象,然后是名为 1 的属性的值。

    编辑:您还弄错了流程中的处理器顺序。由于您已将set-payload 放在response 块中,因此它将在object-to-json-transformer 之后执行,这显然不是您想要的。

    我建议你干脆选择:

    ...
    </db:select>
    <set-payload value="#[message.payload[0]['1']]" />
    <json:object-to-json-transformer />
    

    【讨论】:

    • 我在 SetPayload 节点中尝试了#[message.payload[0]['1']]。 (Object-to-JSON 没有 java.util.HashMap 的返回类)。我出现以下运行时错误 表达式“message.payload[0]['1']”的执行失败。 (org.mule.api.expr ession.ExpressionRuntimeException)。消息负载的类型:字符串
    • 这次我尝试了#[message.payload[0]['1']]的SetPayload(这次Object-to-JSON DID有一个返回类java.util.HashMap) .我收到以下错误:转换的对象是类型:“SimpleDataType{type=java.lang.String, mimeTy pe='/'}”,但预期的返回类型是“SimpleDataType{type =java.util.HashM ap,mimeType='application/json'}"。消息负载的类型为:LinkedList (org.m ule.api.transformer.TransformerMessagingException)。消息负载的类型:
    • 对不起,我可以在 cmets 中读取 XML,最好编辑您的问题。我已经查看了我的答案,因为我刚刚意识到您正在使用 response 块,这很可能没有按照您的意愿执行。
    • 我改变了流程。我希望我没有遗漏任何东西。但是,现在我得到了一些长长的清单。我该如何解决这个问题?谢谢
    • 检查我的答案:它是json:object-to-json-transformer 而不是json:json-to-object-transformer
    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2012-03-09
    相关资源
    最近更新 更多