如何基于Mule中的键值合并两个Json

时间:2017-01-07 19:47:13

标签: json mule mule-studio dataweave cloudhub

嗨我有一个1 json,如下所示

"first": [
{
  "projectid": "15",
  "approval_status": "A"
},
{
  "projectid": "24",
  "approval_status": "A"
}  ]}

下一个有效负载是存储在flowVariable

{
 "Second": [
{
  "projectid": "15",
  "total": "123",
  "updated": "yes"
},
   {
  "projectid": "24",
  "total": "123",
  "updated": "yes"
}]}

我使用datawevae来合并这些有效负载,但是它没有给出预期的结果我的期望值是

 {
 "Result": [
{
  "projectid": "15",
  "total": "123",
  "approval_status": "A"
},
   {
  "projectid": "24",
  "total": "123",
  "approval_status": "A"
}]}

3 个答案:

答案 0 :(得分:0)

我不确定你是如何同时获得两个有效载荷的

但是,如果您能够同时获得有效负载并能够保存到2个流量变量中,那么您可以使用表达式变换器来构建组合的有效负载。
下面是一个示例,您可以尝试动态地合并两个有效负载: -

     <set-payload value="{
    &quot;first&quot;: [{
        &quot;projectid&quot;: &quot;15&quot;,
        &quot;approval_status&quot;: &quot;A&quot;
    }, {
        &quot;projectid&quot;: &quot;24&quot;,
        &quot;approval_status&quot;: &quot;A&quot;
    }]
   }" mimeType="application/json" doc:name="Set Payload"/>
       <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
        <set-variable variableName="var1" value="#[message.payload]" doc:name="Variable"/>

        <set-payload value="{
    &quot;Second&quot;: [{
        &quot;projectid&quot;: &quot;15&quot;,
        &quot;total&quot;: &quot;123&quot;,
        &quot;updated&quot;: &quot;yes&quot;
    }, {
        &quot;projectid&quot;: &quot;24&quot;,
        &quot;total&quot;: &quot;123&quot;,
        &quot;updated&quot;: &quot;yes&quot;
    }]
  }" mimeType="application/json" doc:name="Set Payload"/>
        <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
        <set-variable variableName="var2" value="#[message.payload]" doc:name="Variable"/>

        <expression-transformer
     expression="#[[

     'Result':[
     {
      'projectid': flowVars.var1.first[0].projectid,
      'total': flowVars.var2.Second[0].total,
      'approval_status': flowVars.var1.first[0].approval_status
    },
    {
     'projectid': flowVars.var1.first[1].projectid,
     'total': flowVars.var2.Second[1].total,
     'approval_status': flowVars.var1.first[1].approval_status
   }

  ]]
      ]" doc:name="Expression"/>
  <json:object-to-json-transformer doc:name="Object to JSON"/>     

请注意,上述示例仅用于说明如何将有效负载动态快速组合在一起。
在这里,您需要将有效负载存储在流变量 var1 var2 I have used set payload just to demonstrate, you need to get it dynamically中,然后您可以构建有效载荷动态使用表达式变换器
另请注意,如果您使用完全相同的结构获取json有效负载,则可以使用上面的代码快速组合有效负载...
但是,如果你的json结构更改说你的有效负载中包含了一个列表元素,那么你需要修改上面的代码并使用for循环来获取值。

上面的代码将产生一个快速组合的有效载荷,如下所示: -

{
  "Result": [
    {
      "total": "123",
      "projectid": "15",
      "approval_status": "A"
    },
    {
      "total": "123",
      "projectid": "24",
      "approval_status": "A"
    }
  ]
}

答案 1 :(得分:0)

我已经在本文中明确提到了如何做到这一点

Dzone article about Merging payload using DataWeave

答案 2 :(得分:-1)

编辑答案 现在它将根据您的ID动态过滤。

&#13;
&#13;
                        %dw 1.0
%output application/json
%var json1 = {"first": [{  "projectid": "15", "approval_status": "A"},{  "projectid": "24",  "approval_status": "A"}  ]}
%var json2 = { "Second": [{  "projectid": "15",  "total": "123",  "updated": "yes"},   {  "projectid": "24",  "total": "123",  "updated": "yes"}]}
---

Result: ( using(json2Group = json2.Second groupBy $.projectid) (json1.first  filter ( json2Group[$.projectid] != null)  map (( $  ++ json2Group[$.projectid][0]) ) distinctBy $  )    )
&#13;
&#13;
&#13;