如何在wso2esb中避免JSON响应中的jsonObject 4.9.0

问题描述:

我正在使用wso2esb 4.9.0, 我有一种服务,它从数据库中选择数据并以JSON格式给出响应。如何在wso2esb中避免JSON响应中的jsonObject 4.9.0

代理服务:

<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="GetMquestionMobile3.0" 
     transports="https http" 
     startOnLoad="true" 
     trace="disable" 
     statistics="enable"> 
    <description/> 
    <target> 
     <inSequence onError="fault"> 
     <property name="messageType" value="application/json" scope="axis2"/> 
     <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
     <property name="userid" expression="get-property('transport', 'userid')"/> 
     <property name="ModifiedOn" expression="get-property('transport', 'ModifiedOn')"/> 
     <property name="username" expression="get-property('transport', 'username')"/> 
     <property name="password" expression="get-property('transport', 'password')"/> 
     <property name="PartyBranchID" 
        expression="//FieldValue/text()" 
        scope="default" 
        type="STRING"/> 
     <property name="usercode" 
        expression="fn:substring-before(get-property('username'),'|')" 
        scope="default" 
        type="STRING"/> 
     <property name="clientid" 
        expression="fn:substring-after(get-property('username'),'|')" 
        scope="default" 
        type="STRING"/> 
<payloadFactory media-type="xml"> 
      <format> 
       <p:Getmquestions_Mobile xmlns:p="http://ws.wso2.org/dataservice"> 
        <p:clientid>$1</p:clientid> 
        <p:modifiedon>$2</p:modifiedon> 
       </p:Getmquestions_Mobile> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('clientid')"/> 
       <arg evaluator="xml" expression="get-property('ModifiedOn')"/> 
      </args> 
     </payloadFactory> 
     <send receive="MquestionMobile_Seq33.0"> 
      <endpoint> 
       <address uri="http://localhost:9764/services/mquestions_DataService3.0/" 
         format="soap11"> 
        <suspendOnFailure> 
        <errorCodes>101500,101501,101506,101507,101508,101503,50000</errorCodes> 
        <initialDuration>30</initialDuration> 
        <progressionFactor>1.0</progressionFactor> 
        <maximumDuration>300</maximumDuration> 
        </suspendOnFailure> 
       </address> 
      </endpoint> 
     </send> 
</inSequence> 
     <outSequence onError="fault"> 
     <send/> 
     </outSequence> 
    </target> 
</proxy> 

顺序:

<sequence xmlns="http://ws.apache.org/ns/synapse" 
      name="MquestionMobile_Seq33.0" 
      statistics="enable"> 
    <property name="messageType" value="application/json" scope="axis2"/> 
    <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
    <property name="HTTP_METHOD" value="POST" scope="axis2"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      xmlns:s="http://ws.wso2.org/dataservice" 
      name="Datalist" 
      expression="//s:Datalist" 
      scope="default" 
      type="STRING"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      xmlns:s="http://ws.wso2.org/dataservice" 
      name="Total" 
      expression="count(//s:Datalist)" 
      scope="default" 
      type="STRING"/> 
<filter xmlns:ns="http://org.apache.synapse/xsd" 
      xpath="get-property('Total')='0.0'"> 
     <then> 
     <property name="RESPONSE" value="true" scope="default" type="STRING"/> 
     <payloadFactory media-type="json"> 
      <format> 
     {"ResponseJSON":{"Body":{"Datalist":"Not Found"},"Status":"404"}} 
    </format> 
      <args/> 
     </payloadFactory> 
     <send/> 
     </then> 
     <else> 
     <property name="RESPONSE" value="true" scope="default" type="STRING"/> 
     <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
     <payloadFactory media-type="json"> 
      <format>{"ResponseJSON" : {"Body" :$1,"Status" :"200","Total" :"$2"}}</format> 
      <args> 
       <arg evaluator="json" expression="$.Body"/> 
       <arg evaluator="xml" expression="get-property('Total')"/> 
      </args> 
     </payloadFactory> 
     <send/> 
     </else> 
    </filter> 
</sequence> 

该服务给我的答复,如下面

{"jsonObject":{"ResponseJSON" : 
    {"Body" : 
    {"Datalist":[ 
    {"ComboValues":"Yes,No","QuestionType":0,"Tag":-1,"Question":"LogBooks","IsAVPT":-1,"QuestionId":989181535979317,"DataSize":-1.0,"ToolTip":-1,"IsFollowup":-1}, 
    {"ComboValues":"Yes,No","QuestionType":0,"Tag":null,"Question":"MasterRegister","IsAVPT":-1,"QuestionId":989181536700214,"DataSize":-1.0,"ToolTip":null,"IsFollowup":-1}, 
    {"ComboValues":null,"QuestionType":0,"Tag":null,"Question":"OthersRecords","IsAVPT":-1,"QuestionId":989181536732983,"DataSize":-1.0,"ToolTip":null,"IsFollowup":-1}]},"Status":"200","Total":"3.0"}}} 

我不希望看到的JSONObject在我响应,我如何避免这在我的JSON响应,并得到如下响应

{"ResponseJSON" : 
     {"Body" : 
     {"Datalist":[ 
     {"ComboValues":"Yes,No","QuestionType":0,"Tag":-1,"Question":"LogBooks","IsAVPT":-1,"QuestionId":989181535979317,"DataSize":-1.0,"ToolTip":-1,"IsFollowup":-1}, 
     {"ComboValues":"Yes,No","QuestionType":0,"Tag":null,"Question":"MasterRegister","IsAVPT":-1,"QuestionId":989181536700214,"DataSize":-1.0,"ToolTip":null,"IsFollowup":-1}, 
     {"ComboValues":null,"QuestionType":0,"Tag":null,"Question":"OthersRecords","IsAVPT":-1,"QuestionId":989181536732983,"DataSize":-1.0,"ToolTip":null,"IsFollowup":-1}]},"Status":"200","Total":"3.0"}} 

DS响应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <Body xmlns="http://ws.wso2.org/dataservice"> 
     <Datalist> 
      <Question>LogBooks</Question> 
      <QuestionId>989181535979317</QuestionId> 
      <QuestionType>0</QuestionType> 
      <ComboValues>Yes,No</ComboValues> 
      <IsFollowup>-1</IsFollowup> 
      <IsAVPT>-1</IsAVPT> 
      <DataSize>-1.0</DataSize> 
      <ToolTip>-1</ToolTip> 
      <Tag>-1</Tag> 
      <weightage>1.00</weightage> 
     </Datalist> 
     <Datalist> 
      <Question>Master Register</Question> 
      <QuestionId>989181536700214</QuestionId> 
      <QuestionType>0</QuestionType> 
      <ComboValues>Yes,No</ComboValues> 
      <IsFollowup>-1</IsFollowup> 
      <IsAVPT>-1</IsAVPT> 
      <DataSize>-1.0</DataSize> 
      <ToolTip/> 
      <Tag/> 
      <weightage>1.00</weightage> 
     </Datalist> 
     <Datalist> 
      <Question>Others Records</Question> 
      <QuestionId>989181536732983</QuestionId> 
      <QuestionType>0</QuestionType> 
      <ComboValues/> 
      <IsFollowup>-1</IsFollowup> 
      <IsAVPT>-1</IsAVPT> 
      <DataSize>-1.0</DataSize> 
      <ToolTip/> 
      <Tag/> 
      <weightage>1.00</weightage> 
     </Datalist> 
      </Body> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

请粘贴您的DS XML响应来模拟您的方案。 –

+0

嗨豪尔赫我编辑了我的问题与DS响应,请检查。 – user4045063

+0

您是通过Soap还是Json请求发送的?你应该使用Json路径(json-eval($。))来提取那些第一个属性,如果它的Json。如果它的soap然后删除application/json属性。 Jsonobject是Json的xml表示,所以我认为可能会有太多的转换在您的流程中进行。尝试在你的序列中保留xml,应用你的逻辑,发送到outSeq,然后在那里做出转换到Json之前做出反应 – JavaMastaRSA

您可以使用充实调解员从响应清除体内的JSONObject像下面。

<enrich> 
    <source clone="true" xpath="$body//jsonObject//ResponseJSON"/> 
    <target type="body"/> 
</enrich> 

您可以在添加介体并添加更改后的主体后添加日志介体。

希望这会帮助你。

在ESB中介体通信中发生SOAP消息。当您发送JSON请求或ESB收到JSON响应时,ESB会通过添加标记将其转换为xml/soap消息来防止多根xml。 尝试使用

<property name="messageType" value="application/json" scope="axis2"/> 

发送/调用之前。这会自动从响应中删除你的jsonObject。但如果你要转换的响应从JSON XML,那么你需要用丰富调解员手动修改

使axis2.xml能确保JSON格式