【问题标题】:JSON generation using TransformMessage in Mule在 Mule 中使用 TransformMessage 生成 JSON
【发布时间】:2018-03-15 20:43:13
【问题描述】:

我正在尝试生成以下 JSON ...

{ "myVariable": [ { "LoopId": "2" }, { "LoopId": "3" }, { "LoopId": "4" } ] }

并且能够通过类代码实现这一点......使用 Java 节点(在 Mule 中)

package com.mule.integrations.pakage;

public class CreateJsonPayload {
public String generateJsonPayload(String last) {

 int lastInt = Integer.parseInt(last);      
 String jsonPayload = "{ \"MyVariable\" : [ ";

 for (int i=1; i <= lastInt; i++) {         
     jsonPayload = jsonPayload + "{ \"LoopId\":\"" + i + "\" }";
     if (i < lastInt) jsonPayload = jsonPayload + ",";
 }

 jsonPayload = jsonPayload + " ]}";     
 return jsonPayload;
}


}

因为我必须根据变量生成此 JSON,并使用 JSON 中的“LoopId”节点数。

比如varNumberOfLoops = 5,我需要通过5生成{"LoopId":"1"}。

如果我想通过 DataWeave 的“TransformMessage”节点生成相同的内容,我该怎么做?

对此的任何指针表示赞赏。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请注意,您的部分代码格式不正确。最好在前面加上4个空格来格式化。

标签: json mule-studio dataweave


【解决方案1】:

这对你有用..

 %dw 1.0
 %output application/json
 %var resultStart = '1' as :number
 %var resultEnd = flowVars.varNumberOfLoops as :number
 %var range = [[resultStart][0] .. [resultEnd][0]]
 ---
 {
     "myVariable": range map {
         "LoopId"    : $ as :string
     }
 } 

【讨论】:

  • 此代码形式也可以产生所需的结果 - %dw 1.0 %output application/json %function iterate(response,counter) response when counter-1 >= flowVars.varNumberOfLoops 否则 iterate(response + + [{"LoopId":counter}],counter+1) --- { myVariable:iterate([],1) }
【解决方案2】:

以下代码将为您提供解决方案。希望这会有所帮助。

<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
    <set-variable variableName="myVar" value="#[message.payload.myVariable]" doc:name="myVar"/>
    <dw:transform-message doc:name="Transform Message">
        <dw:set-payload><![CDATA[%dw 1.0
 %output application/json
 %var a=flowVars.myVar
 ---
  "myVariable":
 [1 .. a] map {
     "LoopId"    : $
 }]]></dw:set-payload>
        </dw:transform-message>
        <logger message="JSONNNNN #[message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/>

输出是 ::

{
"myVariable": [
    {
        "LoopId": 1
    },
    {
        "LoopId": 2
    },
    {
        "LoopId": 3
    }
]

}

【讨论】:

  • 感谢您的快速回复。在任何点 Studio 中导致错误 - 输入“a]”无效,预期为 *、=、as、或、>>、~=、binaryOp、匹配、-、==、默认值, :range, +, !=, when, and, / or >
  • 我们定义了一个 dataweave 变量,并为我的变量分配了 flowVars.myvar。我在我的 Anypoint 工作室中对此进行了测试并按预期工作。如果 APS 本身没有启动意味着您需要查看 APS 抛出的编译时错误。请发布完整流程
  • 我之前也尝试在 DataWeave 中做同样的事情,结果导致预期的错误是,*,=,as,或,>>,~=,binaryOp , match, -, ==, default, :range, +, !=, when, and, / or > – 甚至在我运行流程之前...这是格式化或编译错误
  • 我删除了变量 'a' 和 '.' 之间的空格。 (点),它编译...但在执行时导致此错误@运行时异常:[1 ..a] map { ^ Type mismatch for 'Descendants Selector ..' operator found :number required :array.
【解决方案3】:

根据您的要求尝试此代码。

来自 POSTMan 发送此请求

{ "myVariable":3 }

然后下面是流程

<http:listener-config name="HTTP_Listener_Configuration" host="localhost" port="8088" basePath="/config" doc:name="HTTP Listener Configuration"/>

<flow name="TestFlow" >
   <http:listener config-ref="HTTP_Listener_Configuration" path="/testXml" allowedMethods="POST" doc:name="HTTP"/>
    <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
    <set-variable variableName="myVar" value="#[message.payload.myVariable]" doc:name="myVar"/>
    <dw:transform-message doc:name="Transform Message">
        <dw:set-payload><![CDATA[%dw 1.0
 %output application/json
 %var a=flowVars.myVar
 ---
  "myVariable":
 [1 .. a] map {
     "LoopId"    : $
 }]]></dw:set-payload>
        </dw:transform-message>
        <logger message="JSONNNNN #[message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/>   


</flow>

下面是响应。

{
"myVariable": [
    {
        "LoopId": 1
    },
    {
        "LoopId": 2
    },
    {
        "LoopId": 3
    }
]

}

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多