如何使用包含XML的文本创建JSON有效内容?

时间:2016-09-18 19:15:32

标签: json xml wso2 wso2esb

我尝试创建一个自动JIRA问题报告(在某些故障序列中)。 我为JSON API制作了JIRA有效负载,这对于文本来说效果很好。 不过,我想向JIRA报告SOAP请求和回复,以便我就此问题进行调查。

我的问题是如何创建包含JSON的文字的XML有效内容?

我在WSO2 ESB

中收到此异常
[2016-09-18 21:46:31,774] ERROR - NativeWorkerPool Uncaught exception
java.lang.Error: Error: could not match input
    at org.apache.synapse.commons.staxon.core.json.stream.impl.JsonScanner.zzScanError(JsonScanner.java:530)
    at org.apache.synapse.commons.staxon.core.json.stream.impl.JsonScanner.yylex(JsonScanner.java:941)

我要生成的有效负载

<payloadFactory description="" media-type="json">
      <format>
                {
                "fields": {
                "project":
                {
                "key": "$1"
                },
                "summary": "$2",
                "description": "$3",
                "issuetype": { "name": "$4" } 
                                }
                }
            </format>
      <args>
        <arg evaluator="xml" expression="$func:projectKey"/>
        <arg evaluator="xml" expression="$func:summary"/>
        <arg evaluator="xml" expression="$func:description"/>
        <arg evaluator="xml" expression="$func:issueType"/>
      </args>
    </payloadFactory>

我想将一些包含XML的文本发送到参数$ func:description中。当我只将差的XML发送到$ func:description时,有效负载Factory转换为JSON,在这种情况下不需要,XML应该是一个文本 - 消息

for the completeness to get the XML message I used 

<property expression="$body" name="request"
        scope="default" type="STRING"/>

调用终点

  <property expression="$body" name="response"
    scope="default" type="STRING"/>

我需要知道bind&#34; request&#34; +&#34;回应&#34;进入$ func:description

2 个答案:

答案 0 :(得分:0)

如果XML格式正确,您只需将messageType属性设置为application / json并自动执行转换。有关详细信息,请参阅this

否则,您可以使用有效负载Factory mediator或Enrich mediator来自定义构建Json。

答案 1 :(得分:0)

  1. 使用您喜欢的XML结构创建有效负载。

  2. 使用JS脚本中介将一个节点修改为CDATA。

  3. 更改内容类型。

  4. 我的代理配置,请根据您的要求进行更改:

    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="XMLinsideJSON"
           transports="http https"
           startOnLoad="true">
       <target>
          <inSequence>    
            <property name="BOK" expression="//*[1]" type="OM"  scope="default"/> 
                <enrich>
                    <source type="inline" clone="true">
                        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                            <soapenv:Header/>
                            <soapenv:Body>
                                <fields xmlns="">
                                    <summary xmlns=""/>
                                    <project xmlns=""/>
                                    <description xmlns=""/>                                                       
                                    <issuetype xmlns="">
                                      <name xmlns=""/>                      
                                    </issuetype>                                  
                                </fields>
                            </soapenv:Body>
                        </soapenv:Envelope>
                    </source>
                    <target type="envelope"/>
                </enrich>
                <script language="js">
                    importPackage(Packages.org.apache.axiom.om);
                    var elem= mc.getEnvelope().getBody().getFirstElement().getFirstElement();
                    var myText = elem.getOMFactory().createOMText(elem, mc.getProperty("BOK"), OMNode.CDATA_SECTION_NODE);
                    elem.addChild(myText)                    
                </script>                   
               <property name="messageType" scope="axis2" value="application/json"/>                  
                <respond/>
          </inSequence>
          <outSequence>
             <send/>
          </outSequence>
       </target>
    </proxy>
    

    我的要求:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Header/>
       <soapenv:Body>
          <payload>
             <response>
                <data>AAA</data>
             </response>
          </payload>
       </soapenv:Body>
    </soapenv:Envelope>
    

    我的回答:

    {"fields":{"summary":"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body>\n      <payload>\n         <response>\n            <data>AAA</data>\n         </response>\n      </payload>\n   </soapenv:Body></soapenv:Envelope>","project":null,"description":null,"issuetype":{"name":null}}}