当前位置: 首页 > 知识库问答 >
问题:

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

严昀
2023-03-14

为了简化我的问题,假设我想用有效负载中的'd'替换所有'b'字符。

有没有一种方法可以让我原生地处理JSON数据,而不是首先将数据转换为XML?

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

"Destination": {
        "name": "abc",
        "type": "ST",
        "$": "\n"
     }
MessageContext.getEnvelope().getBody()
<Destination>
  <name>abc</name>
  <type>ST</type>
</Destination>

以在正常情况下传递内容(否则将在XML到JSON处理步骤中失败)。但必须有一种方法让我将数据操作为原生JSON(还是原生字符串?)也许能够获得输入流并从中操作数据?但我找不到从消息上下文到InputStream的方法?

共有1个答案

晏阳飙
2023-03-14

WSO2本身已经编写了处理$字符的逻辑。

从他们的支持文档(https://docs.wso2.com/display/esb481/json+support):

在构建XML元素时,当“$”字符和数字作为JSON键的第一个字符出现时,ESB会以特殊的方式处理它们。

//    "$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;
}
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);
}

}
 类似资料:
  • 这是我的JavaFX控制器 所以我的问题是,在javaFX上下文中,处理<code>未来</code>结果的习惯用法是什么? 我知道我可以做,线程将阻塞,直到操作完成,但我会阻塞Application线程。我正在考虑在完成时进行回调,我发现了,哪种类型通过thenAccep执行此操作,但基于此答案,线程仍将被阻塞,这违反了Future的要点,就像答案中提到的那样。 在我的例子中,可调用的结果(在我

  • 我用JavaFX做了一个国际象棋棋盘,并把所有的方格设置为GridPane的子方格,有没有办法用GridPane索引来访问这些方格并改变它们的属性? 我尝试通过磁贴矩阵访问一个磁贴来更改磁贴的颜色属性,但它不会更改 GridPane 中显示的磁贴。 的。getChildren()方法返回一个节点列表,一旦tile对象成为节点,我就无法访问它的方法。 这是我的磁贴类: } 这是我的董事会课:

  • 问题内容: 我想使用Node Http模块直接调用服务器以设置我的量角器测试。Http基于回调,我想将其变为promise。 例如,我想让这个函数返回promise: 因此,问题是:我需要什么并代替“以某种方式创造承诺”才能使之起作用? 问题答案: 量角器使用WebDriver的承诺,并在“量角器”上全局公开该API。所以你应该能够做 有关完整的WebDriverJS Promise API,请参

  • 根据手册中的组件页面,根据本论坛帖子,将在2019年6月为第14版的Vaadin Flowpromise提供一个合适的菜单栏小部件。 在此之前,该页面建议使用和在第12版中安装菜单栏。 梅努巴 计划在瓦丁14号。当前可通过组合选择(V12)和上下文菜单(V12)进行设置 (a) 我在版本12Javadoc中找不到或。 (b) 有人可以分享一个示例实现吗?

  • 我正在使用junit运行一些单元测试。其中一个调用了一个对象中的方法,我使用mockito-like模拟该对象; 然后我设置mockito做一些类似的事情 现在myClass.foo实际上以我的另一个类(比如类Person)作为参数,我想做的是这样的事情 这当然是伪代码,但我希望它说明了我正在尝试做什么。这可能吗?

  • 为什么下面的语句出现错误 当以下代码正常工作时