用于检查json文件的mule表达式

时间:2016-03-15 18:01:21

标签: java mule mule-el

是否可以编写mule表达式来检查以下json请求中Name的所有值是否相同?

我正在尝试像#[($ in message.payload.id.items if $.Name==$.Name)]这样的东西,但它不起作用 请建议



{"id":
    {
     "items" : [
    {
    "Name": "Raj",
    "transaction_tag": "value1",
    "transaction_type": "withdraw"
    },
{
    "Name": "Raj",
    "transaction_tag": "value2",
    "transaction_type": "submit"
    },
  {
    "Name": "Raj",
    "transaction_tag": "value3",
    "transaction_type": "inquiry"
    }
]
}
}




3 个答案:

答案 0 :(得分:1)

我认为更简洁的实现是使用JSON到Object转换器将JSON映射到POJO(Java对象)。

例如:

<json:json-to-object-transformer returnClass="com.mycompany.Request" doc:name="JSON to Request"
            doc:description="Convert the JSON payload to a Java object for further processing." />

您可以命名您的POJO“请求”,如上例所示,并将其命名为List of Items,以及名称为hasRepeatedItems()的布尔方法,如果重复项目,则返回true或false。 / p>

在您的JSON通过变换器(成功)之后,您的有效负载现在将成为Java对象“请求”。

您可以使用选择路由器并调用方法payload.hasRepeatedItems()。

<choice doc:name="Choice">
            <when expression="payload.hasRepeatedItems()">
                Do something ...
            </when>
            <otherwise>
                Do something else...
            </otherwise>
</choice>

我希望这会有所帮助。如果我需要进一步阐述,请让我打结。

答案 1 :(得分:0)

您可以使用以下代码检查所有Name元素是否具有相同的值= 'Raj': -

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>

 <flow name="testFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
    <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
        <foreach collection="#[message.payload.id.items]" doc:name="For Each">
                <choice doc:name="Choice">
                    <when expression="#[message.payload.Name=='Raj']">
                        <logger level="INFO" doc:name="Logger" message="Equal values"/>
                    </when>
                 <otherwise>
                        <logger message="Not equal" level="INFO" doc:name="Logger"/>
                    </otherwise>
                </choice>
         </foreach>
         <json:object-to-json-transformer doc:name="Object to JSON"/>
    </flow>

替代选项: -
如果您知道JSON列表中元素的编号将被修复(例如,在本例中为3 Name元素),您可以尝试以下操作: -

 <choice doc:name="Choice">
    <when expression="#[message.payload.id.items[0].Name==message.payload.id.items[1].Name and message.payload.id.items[1].Name==message.payload.id.items[2].Name and message.payload.id.items[2].Name==message.payload.id.items[0].Name]">
        <logger level="INFO" doc:name="Logger" message="Equal"/>
      </when>
      <otherwise>
         <logger message="Not equal" level="INFO" doc:name="Logger"/>
       </otherwise>
  </choice>

但最好的选择是遵循上述解决方案,这对任意数量的元素都是有益的

答案 2 :(得分:0)

@Anirban ..对于每个循环解决方案都很棒..但是它的硬编码名称你必须再次检查所有名称的整个数组并从中获取数据。