Mule Datamapper JSON到XML转换

Mule Datamapper JSON到XML转换,mule,datamapper,Mule,Datamapper,JSON输入有效负载信息,我对此有异议 { "name": "xyz", "city": "california", "serialNumber": [ "T2323" , "T2332" ] } 预期转换输出有效负载: <COMPANY_ITEM_INFO> <COMPANY_NAME>xyz</COMPANY_NAME> <COMPANY_CITY>california</COMPANY_NAME&

JSON输入有效负载信息,我对此有异议

{
"name": "xyz",
"city": "california",
"serialNumber": [ 
   "T2323" , 
   "T2332" 
]
}
预期转换输出有效负载:

<COMPANY_ITEM_INFO>
     <COMPANY_NAME>xyz</COMPANY_NAME>
     <COMPANY_CITY>california</COMPANY_NAME>
     <Inv_Update SEGMENT="1"> 
         <SERIALNO>T2323</SERIALNO>  
     </Inv_Update SEGMENT="1">  
     <Inv_Update SEGMENT="1"> 
         <SERIALNO>T2332</SERIALNO>
     </Inv_Update SEGMENT="1">
</COMPANY_ITEM_INFO>
ForEach“序列号”->“库存更新”

//MEL
//START -> DO NOT REMOVE
output.__id = input.__id;
output.__parent_id = input.__id;
//END -> DO NOT REMOVE
output.SERIALNO = input.array;

我知道您正在寻找一个DataMapper解决方案,但如果您对替代方案持开放态度,下面是一个Groovy实现(因为DataMapper即将退出,现在,您应该对选项持开放态度,对吧?)


库存更新(段:“1”){
序列号(序号)
}
}
}
结果=writer.toString()
]]>

请共享两端使用的xsd。也许datamapper的屏幕截图对我来说很有用,但问题可能出在SERIALNO或array的数据类型中(复杂或简单类型,问题可能出在xsd中)。我想引用一下。@star,是的,你是对的。这可以使用Groovy来完成。您知道目前这是数据映射器的一个限制吗?如果你知道如何使用数据映射器来实现这一点,那是有可能的。我认为这可以通过DM来实现,是的,我不知道如何实现,而且,由于它正在消失,进一步学习它并没有什么真正的好处:DGot it。。。好吧如果输入JSON负载没有作为输入负载的一部分填充“name”元素,那么在Groovy中检查NULL值怎么样。。我需要在您建议的代码中更改什么来处理这些情况?如果为null,您希望有什么行为?这是我的请求负载看起来像->{“city”:“california”,“serialNumber”:[“T2323”,“T2332”]}我没有提供名称字段作为输入负载的一部分。我应该如何在代码中处理这种情况?
//MEL
//START -> DO NOT REMOVE
output.__id = input.__id;
//END -> DO NOT REMOVE
output.COMPANY_NAME= input.name;
output.COMPANY_CITY= input.city;
//MEL
//START -> DO NOT REMOVE
output.__id = input.__id;
output.__parent_id = input.__id;
//END -> DO NOT REMOVE
output.SERIALNO = input.array;
<json:json-to-object-transformer
    returnClass="java.lang.Object" />

<scripting:transformer>
  <scripting:script engine="groovy"><![CDATA[
    def writer = new StringWriter() 
    def xml = new groovy.xml.MarkupBuilder(writer)

    xml.COMPANY_ITEM_INFO { 
      COMPANY_NAME(payload.name) 
      COMPANY_CITY(payload.city) 

      payload.serialNumber.each { sn ->
        Inv_Update(SEGMENT: '1') {
          SERIALNO(sn)
        }
      }
    }

    result = writer.toString()
  ]]></scripting:script>
</scripting:transformer>