为什么mule json到xml变换器只拾取第一个元素?

时间:2014-08-01 15:33:21

标签: json mule mule-studio

我正在尝试使用json-to-xml-transformer将json消息转换为xml,但无法找到有关其使用的文档。我不需要对数据进行任何转换,只需将json属性转换为xml标记即可。当我尝试使用变换器时,我得到的只是json中的第一个元素。

输入JSON:

{   
    "site":"mysite", 
    "erpCustno":"123", 
    "shipToState":"PA",
    "shipToZip":"16684",
    "lineInfo": [
        {
            "lineNumber": "10",
            "product": "MAT203"
        }
    ]
}

XML输出:

<?xml version='1.0'?><site>mysite</site>

流速:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd">
    <flow name="newpigrestFlow1" doc:name="newpigrestFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8087" doc:name="HTTP"/>
        <json:json-to-xml-transformer  mimeType="text/xml" doc:name="JSON to XML" ignoreBadInput="true"/>
    </flow>
</mule>

变换器是否需要映射类,或者只是将JSON直接转换为XML(反之亦然,使用xml-to-json-transformer)?

我正在使用Anypoint Studio 2014年7月并部署到Mule EE 3.5.0。

2 个答案:

答案 0 :(得分:5)

首先,请记住XML和JSON结构不是1:1兼容的。

json-to-xml-transformer依赖于Staxon的JSON to XML conversion。查看其文档和mapping conventions,很明显您的输入JSON无法在不丢失的情况下转换为XML。

在您的情况下,JSON根对象的第一个元素用作XML文档的根。您可以通过使用伪根对象包装输入JSON来解决此问题:

{
    "root": {
        "site": "mysite",
        "erpCustno": "123",
        "shipToState": "PA",
        "shipToZip": "16684",
        "lineInfo": [
            {
                "lineNumber": "10",
                "product": "MAT203"
            }
        ]
    }
}

但您可能仍然遇到lineInfo数组中对象的问题。 TBF我不确定Staxon会为此做些什么。

答案 1 :(得分:0)

正如大卫所说,它需要一个正确格式的json,并且mule完美地转换它。我已经分享了流程细节。

<强>流量

<?xml version="1.0" encoding="UTF-8"?>

http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd“&gt;                                          

<强>输入

{
"root": {
    "site": "mysite",
    "erpCustno": "123",
    "shipToState": "PA",
    "shipToZip": "16684",
    "lineInfo": [
        {
            "lineNumber": "10",
            "product": "MAT203"
        }
    ]
}

}

<强>输出

<?xml version='1.0'?><root><site>mysite</site><erpCustno>123</erpCustno><shipToState>PA</shipToState><shipToZip>16684</shipToZip><lineInfo><lineNumber>10</lineNumber><product>MAT203</product></lineInfo></root>