2012-05-25 13 views
7

में कनवर्ट करने में असमर्थ है, मैं एक पीओसी बना रहा हूं। और मैंने Google प्लस के लिए प्रॉक्सी सेवा के माध्यम से एक पास बनाया। किसी भी प्रॉक्सी सेवा मैं इस मिल का उपयोग किए बिना मेरी उत्पादन होता है:WSO2 ESB पूर्ण JSON डेटा को XML

{ 
    "kind":"plus#person", 
    "etag":"\"ExituU7aUpmkkfyD52VulzptThw/4J1clegrhxYC2fsJOu2XWCs1Ewg\"", 
    "id":"117488614303967062311", 
    "displayName":"Abhi NeoN", 
    "name":{ 
     "familyName":"NeoN", 
     "givenName":"Abhi" 
    }, 
    "tagline":"hey guys ! ssup!! check out ma recnt videos... uploaded", 
    "gender":"male", 
    "aboutMe":"\u003cb\u003ehie, abhishek - ma full name \u003c/b\u003e\u003cdiv\u003e\u003cb\u003em a DANCER ,\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei luv ma dancing .\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei care ma dancing ,\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003ei jus hv a gr8 thng in me dats ma dancing.\u003c/b\u003e\u003c/div\u003e", 
    "relationshipStatus":"single", 
    "url":"https://plus.google.com/117488614303967062311", 
    "image":{ 
     "url":"https://lh6.googleusercontent.com/-tF-ip0tUxD4/AAAAAAAAAAI/AAAAAAAAAAA/WKI3USUh_DA/photo.jpg?sz=50" 
    }, 
    "urls":[ 
     { 
     "value":"https://plus.google.com/117488614303967062311", 
     "type":"profile" 
     }, 
     { 
     "value":"https://www.googleapis.com/plus/v1/people/117488614303967062311", 
     "type":"json" 
     } 
    ], 
    "organizations":[ 
     { 
     "name":"our lady of nazareth high school", 
     "title":"science", 
     "type":"school" 
     }, 
     { 
     "name":"", 
     "title":"BLUEBYTES", 
     "type":"work" 
     } 
    ] 
} 

लेकिन जब मैं सेवा के माध्यम से एक सरल पास का उपयोग कर भी ऐसा ही करने की कोशिश मैं सिर्फ मिलती है:

{ 
    "kind":"plus#person" 
} 

मैं wso2esb पर पढ़ें साइट कि उनके पास एक बग था और बग को हल करने के लिए दी गई स्पष्टीकरण यह थी कि प्राप्त जेसन डेटा उचित प्रारूप में नहीं था। लेकिन अब मैं समस्या को कैसे हल करूं? मेरा मतलब यह है कि एएसबी इसे जेसन डेटा में परिवर्तित करने से पहले मैं जेसन डेटा को मैनिपुलेट कर सकता हूं।

उत्तर

5

हमने इस मुद्दे को ईएसबी (संस्करण 4.5.0) की नवीनतम रिलीज में हल किया है। डिफ़ॉल्ट रूप से यह JSONMessageFormatter/JSONBuilder के साथ आता है जो एकाधिक कुंजी के साथ JSON पेलोड को संभाल सकता है।

हम संदेश प्रवाहों को संभालने के लिए एक और समाधान के साथ आए हैं जिसमें विभिन्न प्रकार के JSON < -> एक्सएमएल (या JSON < -> JSON) रूपांतरण शामिल हैं।JSONStreamBuilder और JSONStreamFormatter का उपयोग इस तरह के परिदृश्यों को 'स्क्रिप्ट' मध्यस्थ के साथ लागू करने के लिए किया जा सकता है। ESB 4.5.0 में नमूना # 441 पर एक नज़र डालें।

नमूना # 441 चलाने के लिए;

  • JSONStreamBuilder और JSONStreamFormatter निर्माता के रूप में और भंडार/conf/Axis2/axis2.xml फ़ाइल में JSON के लिए फ़ॉर्मेटर
  • तैनात SimpleStockQuoteService
  • प्रारंभ नमूना axis2server साथ '
  • भागो JSON ग्राहक जोड़े ant newjsonclient '
2

मुझे एक ही समस्या थी।

मेरे अनुभव में, WSO2 ESB के लिए JSON पार्सर (Axis2-json के आधार पर) JSON का केवल एक उपसमूह का समर्थन करता है:

  1. JSON के साथ शुरू करने के लिए है "{", यानी वहाँ नहीं कर सकता जड़ पर एक JSONArray हो।

  2. केवल पहली कुंजी-मूल्य जोड़ी पर विचार किया जाएगा। ऐसा इसलिए है क्योंकि JSON को XML- जैसे डेटास्ट्रक्चर में मैप किया गया है, और XML में रूट होना चाहिए, इसलिए पहली कुंजी-मान जोड़ी को रूट के रूप में माना जाता है।

  3. पहली कुंजी-मूल्य जोड़ी का मान एक सरणी नहीं होना चाहिए। इस कनवर्टर को पता है जो एक्सएमएल टैग प्रत्येक मान के लिए इस्तेमाल किया जाना चाहिए है क्योंकि:

    जैसे: ... { "कुंजी": [ "VAL1", "val2", ...]} -> < कुंजी > VAL1 </कुंजी > < कुंजी > val2 </कुंजी > ....

मैं एक ही समस्या यहाँ है और इस के लिए एक ठीक खोजना चाहते हैं। मेरे विचार एक नया JSONBuilder (पार्सर जो आंतरिक एसओएपी संदेश निर्माण बनाता है) और JSONFormatter (serializer) को वर्चुअल रूट (उदाहरण के लिए {"रूट": ...}) को नकली करने के लिए है।

3

यह वर्तमान धुरी 2 जेएसओएन बिल्डर/फॉर्मेटर की सीमाओं में से एक है। हम वर्तमान में जेएसओएन के लिए एक नई बिल्डर/फॉर्मेटर जोड़ी पर काम कर रहे हैं जो जेएसओएन < -> एक्सएमएल को परिवर्तित नहीं करता है। इसके बजाए यह (बिल्डर) जेएसओएन संदेश को स्ट्रीम के रूप में संग्रहीत करता है और स्क्रिप्ट मध्यस्थ का उपयोग उस स्ट्रीम से जेएसओएन ऑब्जेक्ट बनाने के लिए किया जा सकता है। उदाहरण के लिए, यदि हम ईएसबी के भीतर अनुरोध के रूप में {"a": "x", "b": "y"} भेजते हैं, तो हम जावास्क्रिप्ट के साथ JSON ऑब्जेक्ट के रूप में इस अनुरोध को हेरफेर कर सकते हैं।

var a = mc.getJSON().a.toString(); 
var b = mc.getJSON().b.toString(); 
mc.setPayloadXML(
    <m:A xmlns:m="http://example.json"> 
     <m:a>{a}</m:a> 
     <m:b>{b}</m:b> 
    </m:A>); 

इसी mc.setJSON() विधि मनमाना JSON ऑब्जेक्ट सेट करने के लिए इस्तेमाल किया जा सकता।

+0

तो यह अब तक का क्या मतलब है हम न इस समस्या का किसी अन्य समाधान है ... ?? – yashdosi

+0

यदि आप ईएसबी के भीतर संदेश बनाने या छेड़छाड़ नहीं करना चाहते हैं, तो आप डिफ़ॉल्ट अक्ष 2 बिल्डर/फॉर्मेटर जोड़ी के स्थान पर एप्लिकेशन/जेसन के लिए संदेश रिले संदेश निर्माता/फॉर्मेटर का उपयोग कर सकते हैं। [इस] (http://docs.wso2.org/display/ESB403/Message+Relay) पर एक नज़र डालें। – udeshike

+0

देर से उत्तर के लिए खेद है .. मुझे देखें कि संदेश रिले मेरी समस्या हल करता है .. – yashdosi

3

विश्वसनीय रूप से जेसन को एक्सएमएल में परिवर्तित करने का एकमात्र तरीका और फिर से वापस टी में टाइप संकेतों के उपयोग के माध्यम से है वह एक्सएमएल डिफ़ॉल्ट कनवर्टर ऐसा नहीं करता है। यह 1. सब कुछ पहले संपत्ति के बाद 2. गुणों के साथ एक तत्व सूचियों confuses जब एक्सएमएल से जा रहा

JSON करने के लिए मैं json-util पुस्तकालय, जो एक्सएमएल युक्त प्रकार के json धर्मान्तरित का उपयोग कर transconversion कक्षाएं reimplemented है चला जाता है तत्व अस्पष्टता के रूप में संकेत, कोई अस्पष्टता सुनिश्चित करने के लिए।

इस तरह से हम प्रॉक्सी स्मार्ट (यानी सामग्री मार्ग और परिवहन और पेलोड पर मध्यस्थता) कोई मुद्दा नहीं

इस समस्या का हल साथ WSO2 के माध्यम से सभी json आधारित बाकी सेवाओं के लिए कर सकते हैं में

(मुझे लगता है कि ऊंट यह द्वारा इस तरह से करता है चूक)।

यहाँ पोम फ़ाइल और कोड है:

जगह/भंडार/घटकों/lib में जार

आप सामग्री प्रकार "application/json" के लिए messageformatter और messagebuilder मैपिंग अद्यतन करना होगा axis2.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <name>wso2 json/xml converter</name> 
    <groupId>x.y.z</groupId> 
    <artifactId>wso2converter</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <properties> 
     <jdk.version>1.6</jdk.version> 
    </properties> 

    <build> 
     <finalName>wso2converter</finalName> 
     <resources> 
      <resource> 
       <filtering>false</filtering> 
       <directory>src/main/resources</directory> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>${jdk.version}</source> 
        <target>${jdk.version}</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-enforcer-plugin</artifactId> 
       <version>1.0.1</version> 
       <executions> 
        <execution> 
         <id>enforce-jdk</id> 
         <phase>validate</phase> 
         <goals> 
          <goal>display-info</goal> 
          <goal>enforce</goal> 
         </goals> 
         <configuration> 
          <rules> 
           <requireJavaVersion> 
            <version>[${jdk.version},)</version> 
           </requireJavaVersion> 
          </rules> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>net.sf.json-lib</groupId> 
      <artifactId>json-lib</artifactId> 
      <version>2.3</version> 
      <classifier>jdk15</classifier> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>1.3.2</version> 
      <type>jar</type> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.ws.commons.axiom</groupId> 
      <artifactId>axiom-api</artifactId> 
      <version>1.2.13</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.axis2</groupId> 
      <artifactId>axis2-kernel</artifactId> 
      <version>1.6.2</version> 
     </dependency> 

     <dependency> 
      <groupId>xom</groupId> 
      <artifactId>xom</artifactId> 
      <version>1.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.synapse</groupId> 
      <artifactId>synapse-core</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-json</artifactId> 
      <version>1.1.5</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.13</version> 
      <!--scope>provided</scope--> 
     </dependency> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
      <scope>test</scope> 
     </dependency> 

    </dependencies> 

</project> 

package a.b.wso2; 

import java.io.InputStream; 
import net.sf.json.JSON; 
import net.sf.json.JSONSerializer; 
import net.sf.json.xml.XMLSerializer; 
import org.apache.axiom.om.OMElement; 
import org.apache.axiom.om.util.AXIOMUtil; 
import org.apache.axis2.AxisFault; 
import org.apache.axis2.builder.Builder; 
import org.apache.axis2.context.MessageContext; 
import org.apache.commons.io.IOUtils; 
import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Logger; 


public class WsoJtoX implements Builder { 

    Logger logger = Logger.getLogger("a.b.wso2converter"); 

    @Override 
    public OMElement processDocument(InputStream is, String contentType, 
      MessageContext messageContext) throws AxisFault { 
     String jsonData = ""; 
     try { 

      jsonData = IOUtils.toString(is,"UTF-8"); 


      String output = process(jsonData); 

      OMElement e = AXIOMUtil.stringToOM(output); 
      return e; 


     } catch (Exception e) { 
      logger.error("error converting json string " + jsonData, e); 
      if (e instanceof AxisFault) { 
       throw (AxisFault) e; 
      } 
      throw new AxisFault("(B"+counter+") error converting json to xml", e); 
     } 

    } 

    static int counter=0; 

    public String process(String jsonData) throws AxisFault { 

     try { 
      String tran = "__ns__"; 

      jsonData=jsonData.replace("\r", "").trim(); 
      //jsonData=jsonData.replace("\n", ""); 

      String decoded = (jsonData.replaceAll("\"([a-zA-Z0-9_]*)\\:([a-zA-Z0-9]*)\"(\\s*)(:)", "\"$1" + tran + "$2\"$3:")); 

      counter++; 

      if (logger.isDebugEnabled()) { 
       logger.debug("\n>>>>> (B"+counter+") converting json\n " + jsonData + "\n===="); 
      } 

      XMLSerializer serializer = new XMLSerializer(); 
      JSON json = JSONSerializer.toJSON(decoded); 

      String xml = serializer.write(json); 

      //add in the soap stuff 
      StringBuilder sb = new StringBuilder(); 
      sb.append("<soap:Envelope xmlns:soap=\"http://www.w3.org/2001/12/soap-envelope\" soap:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\"> <soap:Body>"); 
      sb.append(xml.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "")); 
      sb.append("</soap:Body></soap:Envelope>"); 

      if (logger.isDebugEnabled()) { 
       logger.debug("\n==== (B"+counter+") to xml\n" + sb.toString()+"\n<<<<<"); 
      } 

      return sb.toString(); 


     } catch (Exception e) { 
      throw new AxisFault("(B"+counter+") error transforming json to xml", e); 
     } 

    } 

} 

package a.b.wso2; 

import java.io.IOException; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.URL; 
import net.sf.json.JSON; 

import net.sf.json.xml.XMLSerializer; 
import org.apache.axiom.om.OMElement; 
import org.apache.axiom.om.OMOutputFormat; 
import org.apache.axiom.om.util.AXIOMUtil; 
import org.apache.axis2.AxisFault; 
import org.apache.axis2.Constants; 
import org.apache.axis2.context.MessageContext; 
import org.apache.axis2.transport.MessageFormatter; 
import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Logger; 

public class WsoXtoJ implements MessageFormatter { 

    Logger logger = Logger.getLogger("a.b.wso2converter"); 

    private static int counter=0; 

    public String convert(String xData) { 

     counter++; 

      if (logger.isDebugEnabled()) { 
       logger.debug("\n]]]]] (A"+counter+") converting xml\n " + xData + "\n-----"); 
      } 


     try { 
      String tran = "__ns__"; 
      XMLSerializer serializer = new XMLSerializer(); 
      OMElement e = AXIOMUtil.stringToOM(xData); 
      OMElement b = (OMElement) e.getChildrenWithLocalName("Body").next(); 
      b = (OMElement) b.getChildElements().next(); 
      String xfrag = b.toStringWithConsume(); 
      String str = ""; 
      JSON j = serializer.read(xfrag); 
      str = j.toString(); 
      String nstr = str.replaceAll("\"([a-zA-Z0-9_]+)" + tran + "([a-zA-Z0-9]+)\"(\\s*)(:)", "\"$1:$2\"$3:"); //", "\"$1:$2\""); 

      if (logger.isDebugEnabled()) { 
       logger.debug("\n----- (A"+counter+") to json\n" + nstr+"\n[[[[["); 
      } 

      return nstr; 

     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    @Override 
    public String formatSOAPAction(MessageContext msgCtxt, OMOutputFormat format, 
      String soapActionString) { 
     return null; 
    } 

    @Override 
    public byte[] getBytes(MessageContext ctx, OMOutputFormat format) 
      throws AxisFault { 
     String env=""; 
     try { 
      OMElement element = ctx.getEnvelope().getBody().getFirstElement(); 
      String payload = this.convert(element.toString()); 
      return payload.getBytes(format.getCharSetEncoding()); 
     } catch (UnsupportedEncodingException e) { 
      logger.error("(A"+counter+") error converting xml to json "+ctx.getEnvelope().toString()); 
      throw AxisFault.makeFault(e); 
     } 
    } 

    @Override 
    public String getContentType(MessageContext msgCtxt, OMOutputFormat format, 
      String soapActionString) { 
     String contentType = (String) msgCtxt.getProperty(Constants.Configuration.CONTENT_TYPE); 
     String encoding = format.getCharSetEncoding(); 
     if (contentType == null) { 
      contentType = (String) msgCtxt.getProperty(Constants.Configuration.MESSAGE_TYPE); 
     } 
     if (encoding != null) { 
      contentType += "; charset=" + encoding; 
     } 
     return contentType; 
    } 

    @Override 
    public URL getTargetAddress(MessageContext msgCtxt, OMOutputFormat format, 
      URL targetURL) throws AxisFault { 
     return targetURL; 
    } 

    @Override 
    public void writeTo(MessageContext msgCtxt, OMOutputFormat format, 
      OutputStream out, boolean preserve) throws AxisFault { 
     try { 
      out.write(this.getBytes(msgCtxt, format)); 
      out.flush(); 
     } catch (IOException e) { 
      throw AxisFault.makeFault(e); 
     } 
    } 

}