【问题标题】:Mule: Convert XML to JSON with with some of the single element in XML as array in JSONMule:将 XML 转换为 JSON,其中 XML 中的一些单个元素作为 JSON 中的数组
【发布时间】:2014-05-28 14:36:35
【问题描述】:

与客户端的合约是在 rest web 服务调用中发送JSON 有效载荷。在我的Mule 流程中,我处理XML 并在进行Web 服务调用之前,使用

将其转换为JSON
<json:xml-to-json-transformer>

除非出现几个问题,否则它工作得很好。其中之一是在XSD 中,一个元素是用maxOccurs="5" 定义的,但大多数时候这个元素在XML 中只出现1 次。所以问题是:

  1. 当一个数组有多个条目时,它被正确序列化
  2. 当数组只有 1 个条目时,它不是作为数组序列化,而是作为单个字典序列化。

所以,对于这个 XML:

<team>
 <employee>
  <name>Joe</name>
  <surname>Bloggs</surname>
 </employee>
 <employee>
  <name>Jane</name>
  <surname>Doe</surname>
 </employee>
</team>

JSON 是:

{
team:{
 employee:[
  {
    name:'Joe',
    surname:'Bloggs'
  },
  {
    name:'Jane',
    surname:'Doe'
   }
  ]
 }
}

但对于这个XML

<team>
 <employee>
  <name>Joe</name>
  <surname>Bloggs</surname>
 </employee>
</team>

产生的JSON是:

{
  team:{
    employee:{
      name:'Joe',
      surname:'Bloggs'
    }
  }
}

这里的问题是客户期望employee 的值是array(事实并非如此),这违反了合同。

我使用custom-transformerObject Mapper 阅读,可能有一种方法可以指定XML 中的哪个单个元素应强制为JSON 中的array 或注入XSD。有什么办法吗?

【问题讨论】:

    标签: xml json xsd mule


    【解决方案1】:

    不幸的是,没有直接的方法告诉 JSON XML 到 JSON 转换器将元素视为一个数组。

    有两种选择:

    1. Implement a custom JSON transformer of Jackson and use the Force Array option. Please refer to the Jackson webpages for more detials.
    
    2. If possible convert your XML to Java Object. 
    The object will definitely would have defined the elements as an array or colelction.
    Then convert the object to JSON which would be the final expected result of sinngle element as Array in JSON.
    
    
     <mulexml:jaxb-xml-to-object-transformer name="XmlToObject" jaxbContext-ref="JAXBContext" returnClass="java.lang.Object"/>
     <json:object-to-json-transformer doc:name="Object to JSON"/>
    

    希望这会有所帮助。

    【讨论】:

    • 使用Force Array选项,如何区分需要转换为数组的元素与不需要转换为数组的元素?
    • 即使我遇到了同样的问题,但还没有深入研究过该选项。试试看。选项二是我已经执行并验证它有效的方法。
    【解决方案2】:

    这是使用 dataweave 的另一种方法。

    %dw 1.0
    %output application/json
    ---
    {
        team: {
            employee: payload.team.*employee default []
        }
    }
    

    result 是一个员工属性,它总是包含一个列表。

    要使default [] 工作,您必须像这样指定阅读器配置:

    <dw:transform-message metadata:id="06021518-b51d-4dbf-983d-b47ed5ffd0bc" doc:name="Transform Message">
        <dw:input-payload doc:sample="team.xml" mimeType="application/xml">
            <dw:reader-property name="nullValueOn" value="blank"/>
        </dw:input-payload>
        <dw:set-payload><!-- content of dataweave left out --></dw:set-payload>
    </dw:transform-message>
    

    【讨论】:

      【解决方案3】:

      我通过向需要被视为数组的元素添加一个属性来实现这一点,并通过扩展

      块引用 com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer .

      希望这可以帮助任何试图实现这一目标的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 2016-06-09
        • 2017-01-29
        • 2021-09-05
        • 2019-05-17
        相关资源
        最近更新 更多