2012-05-25 2 views
7

POC를 구성 중입니다. 그리고 Google Plus 프록시 서비스를 만들었습니다. 나는이 얻을 프록시 서비스를 사용하지 않고 내 출력 :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에서 읽을 사이트에 버그가 있고 버그를 해결하기 위해 제공된 설명은 json 데이터가 올바른 형식이 아님을 나타냅니다. 하지만 어떻게 문제를 해결할 수 있습니까? 내 말은 json 데이터를 json 데이터로 변환하기 전에 JSON 데이터를 조작 할 수있는 방법 일뿐입니다.

답변

5

최신 릴리스의 ESB (버전 4.5.0)에서이 문제를 해결했습니다. 기본적으로 여러 키가있는 JSON 페이로드를 처리 할 수있는 JSONMessageFormatter/JSONBuilder가 제공됩니다.

다른 종류의 JSON < -> XML (또는 JSON < -> JSON) 변환과 관련된 메시지 흐름을 처리하기위한 또 다른 솔루션이 나왔습니다.JSONStreamBuilderJSONStreamFormatter은 '스크립트'조정자로 이러한 시나리오를 구현하는 데 사용할 수 있습니다. ESB 4.5.0의 샘플 # 441을보십시오.

샘플 # 441을 실행하려면;

  • JSONStreamBuilder 및 빌더로 JSONStreamFormatter 및 저장소/conf의/축 2/axis2.xml 파일에서 JSON에 대한 포맷
  • 배포 SimpleStockQuoteService
  • 시작 '과 샘플 axis2server
  • 실행 JSON 클라이언트를 추가 ant newjsonclient '
2

나는 동일한 문제가있었습니다. 내 경험에

는 (Axis2와-JSON 기준) WSO2 ESB에 대한 JSON 파서가 JSON의 서브 세트 만 지원합니다

  1. json으로로 시작하는이 "{", 즉 존재는 할 수 없습니다 루트에 JSONArray가 있어야합니다.

  2. 첫 번째 키 - 값 쌍만 고려됩니다. 이는 JSON이 XML과 유사한 데이터 구조로 매핑되고 XML에 루트가 있어야하므로 첫 번째 키 - 값 쌍이 루트로 간주되기 때문입니다.

  3. 첫 번째 키 - 값 쌍의 값은 배열이 아니어야합니다. 이는 변환기가 각 값에 대해 사용해야하는 XML 태그를 알아야하기 때문입니다.

    예 : ... { "key": [ "val1", "val2", ...]} -> > 키 VAL1 </> < 키 > 키 ....

내가 같은 문제가 여기있는이에 대한 수정을 찾으려면 >을 val2 < /. 저의 생각은 새로운 SOAP JSONBuilder (내부 SOAP 메시지 구조를 만드는 파서)를 만들고 JSONFormatter (serializer)는 가상 루트 (예 : { " 루트 :": ...})를 사용하여 파서를 가짜로 만드는 것입니다.

3

이것은 현재 axis2 JSON 빌더/포맷터의 제한 사항 중 하나입니다. 현재 JSON < -> XML을 변환하지 않는 JSON 용 새로운 빌더/포맷터 쌍을 작성 중입니다. 대신 (빌더) JSON 메시지를 스트림으로 저장하고 스크립트 조정자를 사용하여 해당 스트림에서 JSON 오브젝트를 빌드 할 수 있습니다. 예를 들어 요청으로 { "a": "x", "b": "y"}를 보내면 ESB 내에서이 요청을 javascript로 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

ESB에서 메시지를 작성하거나 조작하지 않으려면 기본 axis2 빌더/포맷터 쌍 대신 application/json 용 메시지 릴레이 메시지 빌더/포맷터를 사용할 수 있습니다. [this] (http://docs.wso2.org/display/ESB403/Message+Relay)를보십시오. – udeshike

+0

늦게 답장을 보내 주셔서 죄송합니다 .. 메시지 릴레이가 내 문제를 해결하는지 확인하십시오 .. – yashdosi

3

json을 xml로 다시 변환하는 유일한 방법은 t에서 유형 힌트를 사용하는 것입니다 그는 xml. 기본 변환기는이 작업을 수행하지 않습니다. 그것은 1. I XML을 포함하는 형식으로 JSON 변환하는 JSON-UTIL 라이브러리를 사용 transconversion 클래스를 재 구현 한

를 JSON으로 XML로 갈 때 2. 속성 단일 요소 목록을 혼란 최초 등록 후 모든 상품 모호성을 없애기 위해 요소 속성으로 힌트를 제공합니다. 우리가 프록시 스마트 (즉, 콘텐츠 경로 및 전송 및 페이로드에 중재)이이 문제를 해결할 수없는 문제

와 WSO2을 통해 모든 JSON 기반 REST 서비스에 대한 수있는이 방법

(나는 낙타가 이런 식으로 작업을 수행 생각 태만). 여기

는 치어 파일 및 코드 :

장소/저장소/구성 요소/lib 디렉토리에 항아리

콘텐츠 형식 "응용 프로그램/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); 
     } 
    } 

}