2016-03-31 42 views
0

我試圖操縱REST-API的json-request-reply場景中的數據。如何在WSO2 ESB中操作本機Json?

爲了簡化我的問題,我們假設我想在有效載荷內用'd'替換所有'b'字符。

有沒有辦法讓我在json-data上本地工作,而不是先將數據轉換爲XML?

我試圖建立一個自定義的類調解器放入我的OutSequence,但由於我只有訪問MessageContext,它將有效載荷視爲XML,我遇到了問題。

問題是,json無法轉換爲XML或從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.JsonStreamBuilder和格式:org.apache.synapse.commons.json.JsonStreamFormatter

通過在正常情況下的內容(否則它將在XML到JSON處理步驟中失敗)。但是,我必須有一種方法讓我以本機JSON(或本地字符串?)操縱數據,或許能夠掌握InputStream並從中操縱數據?但是我找不到從消息上下文到InputStream的方法?

回答

0

原來,WSO2本身已經編寫了處理$ -characters的邏輯。

從他們的支持文檔(https://docs.wso2.com/display/ESB481/JSON+Support):

當建立XML元素中,ESB處理「$」字符,並以特殊的方式 數字,當他們出現的 一個JSON的第一個字符鍵。

$ -character在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; 
} 

正如我們所看到的,代碼假設屬性會以$字符數限制開始和有至少有一個其他角色。在我們的案例中這不是真的,這就是爲什麼我們的代碼失敗並且財產「丟失」的原因。

爲了避免這種情況,我編寫了一個自定義JSONStreamBuilder來替換實際InputStream中的所有$ -characters,以確保正確處理對話。

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); 
} 

} 

我在Axis2配置取代了JSON流構造器後,我可以愉快的做我的序列有效載荷的任何腳本技術,並保持$字符數限制屬性。

我希望這可以幫助任何與我面臨同樣問題的人。