2014-04-17 6 views
4

Mes réponses de service back-end avec XML, et je le renvoie tel quel par défaut.WSO2-ESB format de réponse JSON

J'ai besoin de convertir une réponse à JSON dans le "outSequence" si un client me donne un argument d'ajouts (comme: & outout_format = json).

Par exemple:

<result> 
<foo>bar</foo> 
<foo2>bar2</foo2> 
<nested> 
<node>value</node> 
</nested> 
</result> 

doit être répondu comme

{ 
"foo": "bar", 
"foo2": "bar2", 
"nested":{ 
"node":"value" 
} 
} 

Voici un test proxy service (je viens d'utiliser ici inSequence pour montrer le problème):

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
      name="JSONtest" 
      transports="https,http" 
      statistics="disable" 
      trace="disable" 
      startOnLoad="true"> 
     <target> 
      <inSequence> 
      <property name="TEST_WAITING_FOR" 
         value="json" 
         scope="default" 
         type="STRING"/> 
      <header name="To" action="remove"/> 
      <property name="RESPONSE" value="true"/> 
      <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
      <payloadFactory media-type="xml"> 
       <format> 
        <response xmlns=""> 
         <result>success</result> 
         <code>123</code> 
        </response> 
       </format> 
       <args/> 
      </payloadFactory> 
      <switch source="get-property('TEST_WAITING_FOR')"> 
       <case regex="json"> 
        <property name="messageType" 
          value="application/json" 
          scope="axis2" 
          type="STRING"/> 
       </case> 
       <default> 
        <property name="messageType" value="text/xml" scope="axis2" type="STRING"/> 
       </default> 
      </switch> 
      <send/> 
      </inSequence> 
     </target> 
     <description/> 

Il resp réponses:

{"response":{"result":"success","code":123}} 

Y at-il un moyen de supprimer la "réponse" du nœud racine pour le faire ressembler à ceci?

{"result":"success","code":123} 

Lorsque je tente de supprimer un nœud "résultat" avec Enrich-médiateur (ex corps $/result/* -.> $ Body/*), il devient un XML non valide avec plusieurs nœuds racine et JSON contient seulement le premier.

Je sais qu'il est possible de charger un message JSON, mais backend peut renvoyer un XML avec différents formats et différents nombres de nœuds imbriqués, donc je ne peux pas le coder en JSON.

Il semble que j'ai besoin d'implémenter mon propre JSONMessageFromatter? (Aucun exemple de code?)

UPD: J'ai trouvé la solution (grâce à Dakshika)

<payloadFactory media-type="json"> 
      <format>$1</format> 
      <args> 
       <arg expression="$.response" evaluator="json"></arg> 
      </args> 
</payloadFactory> 

Répondre