2016-03-31 14 views
0

REST-APIのjson-request-replyシナリオでデータを操作しようとしています。WSO2 ESBでネイティブJsonを操作する方法は?

私の問題を単純化するため、すべての 'b'文字をペイロード内の 'd'に置き換えたいとしましょう。

json-dataでネイティブに作業し、最初にデータをXMLに変換しない方法はありますか?

OutSequenceに入れるカスタムクラスのメディエータを作成しようとしていますが、ペイロードをXMLとして扱うMessageContextにしかアクセスできないため、問題が発生しています。

問題は、jsonをXMLとの間で変換できないことです。

それは、その構造内でこの部分を持っている

"Destination": { 
     "name": "abc", 
     "type": "ST", 
     "$": "\n" 
    } 

「$」プロパティが有効なJSONですが、WSO2 ESBは常にそのMessageContextに内部のデータをXMLとして扱うので、タグにそのプロパティを変換することはできません私は私のクラスメディエーターの内側

MessageContext.getEnvelope().getBody() 

を行うたび明らかに、そう、応答は次のとおりです。

<Destination> 
    <name>abc</name> 
    <type>ST</type> 
</Destination> 

$プロパティがありません。

私はメッセージビルダー使用しています:(通常のケースでは、コンテンツを通過するにはorg.apache.synapse.commons.json.JsonStreamFormatter

:org.apache.synapse.commons.json.JsonStreamBuilderとフォーマッタをそれ以外の場合は、XMLからJSONへの処理ステップで失敗します)。しかし、ネイティブのJSON(またはネイティブのString?)としてデータを操作し、おそらくInputStreamを取得してそこからデータを操作できる方法が必要ですか?しかし、私はMessage ContextからInputStreamに到達する方法を見つけることができませんか?

答えて

0

WSO2自体には、$文字を処理するロジックが書かれています。彼らはJSON の最初の文字として表示されます

XML要素を構築し、ESBは、「$」文字と特殊な方法で 数字を処理します。彼らのサポート・ドキュメント(https://docs.wso2.com/display/ESB481/JSON+Support)から

キー。

$ - 文字は、XML表現で "_JsonReader_PS_"として置き換えられます。しかし、私はこのためのコード(愛のオープンソース)に見て、これはこのケースを扱うコードです:

// "$a" replace with "_JsonReader_PS_a" 
private String replaceInvalidCharacters(String keyString){ 
    if(Pattern.compile("^[0-9]").matcher(keyString).find()) { 
     return "_JsonReader_PD_" + keyString; 
    } else if (keyString.startsWith("$")){ 
     return "_JsonReader_PS_" + keyString.substring(1); 
    } else 
     return keyString; 
} 

私たちが見ることができるように、コードは、プロパティが$ -characterで開始し、必要がありますと仮定し少なくとも1つの他の文字。これは私たちのケースでは当てはまりません。なぜコードが私たちにとって失敗し、プロパティが "失われた"のかです。

これを回避するために、私は会話が正しく処理されたことを確認するために、実際のInputStreamのすべての$ -charactersを置き換えるカスタムJSONStreamBuilderを書きました。私はAxis2の構成でJSONストリームビルダを交換した後

import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.axiom.om.OMElement; 
import org.apache.axis2.AxisFault; 
import org.apache.axis2.builder.Builder; 
import org.apache.axis2.context.MessageContext; 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.apache.synapse.commons.json.JsonStreamBuilder; 

/* 
* As WSO2 JSON parser can't handle single $ properties when converting between JSON and XML 
* This custom JSON Stream builder replaces all $ signs with the constant '_JsonReader_PS_', 
* which the WSO2 parser treats as a $ sign when transforming. 
*/ 

public class CustomJsonStreamBuilder implements Builder { 

private static final Log logger = LogFactory.getLog(CustomJsonStreamBuilder.class.getName()); 

JsonStreamBuilder jsonStreamBuilder = new JsonStreamBuilder(); 

public OMElement processDocument(InputStream arg0, String arg1, MessageContext arg2) throws AxisFault { 

    logger.debug("Processing input stream for custom JSON stream builder"); 

    BufferedReader br = null; 
    StringBuilder sb = new StringBuilder(); 

    String line; 
    try { 

     br = new BufferedReader(new InputStreamReader(arg0)); 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     String input = sb.toString(); 

     /* 
     * WSO2 JSON parser treats _JsonReader_PS_ as $ in JSON structure 
     */ 

     input = input.replace("$", "_JsonReader_PS_"); 
     InputStream is = new ByteArrayInputStream(input.getBytes("utf-8")); 

     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return jsonStreamBuilder.processDocument(is, arg1, arg2); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     logger.error("Problem processing input stream for custom JSON stream builder", e); 
    } 

    return jsonStreamBuilder.processDocument(arg0, arg1, arg2); 
} 

} 

は、私は喜んで私のシーケンス内のペイロードに任意のスクリプト技術を行い、$ -character財産を保つことができます。

私はこれが私と同じ問題に直面している人に役立つことを願っています。

関連する問題