繁体   English   中英

如何在WSO2 ESB中操纵本地Json?

[英]How to manipulate native Json in WSO2 ESB?

我正在尝试在REST-API的json-request-reply场景中操作数据。

为了简化我的问题,假设我想用有效载荷内的所有“ b”字符​​替换为“ d”。

我有办法本地处理json数据,而不先将数据转换为XML吗?

我试图构建一个自定义类介体以放入我的OutSequence中,但是由于我只能访问MessageContext(将有效负载视为XML),因此遇到了问题。

问题在于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.JsonStreamBuilder和格式化程序:org.apache.synapse.commons.json.JsonStreamFormatter

在正常情况下要传递内容(否则,它将在XML to JSON处理步骤中失败)。 但是我必须有一种方法可以将数据作为本机JSON(或本机String?)进行操作,也许可以获取InputStream并从中进行数据处理? 但是我找不到从消息上下文访问InputStream的方法吗?

事实证明,WSO2本身已经编写了处理$字符的逻辑。

从他们的支持文档( https://docs.wso2.com/display/ESB481/JSON+Support ):

在构建XML元素时,ESB在显示为JSON密钥的第一个字符时会以特殊方式处理“ $”字符和数字。

$字符在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中的所有$字符,以确保正确处理了对话。

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流构建器之后,我可以很高兴对序列中的有效负载执行任何脚本技术,并保留$ -character属性。

我希望这可以帮助遇到与我相同问题的任何人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM