Как написать пользовательский посредник в Wso2 ei для преобразования списка полезных данных json в один список

#java #json #wso2 #aggregate #wso2esb

Вопрос:

Я пытаюсь преобразовать свой агрегированный список ответов списка wso2 в единый список. Но посредник скрипта не работает. поэтому я пытаюсь использовать пользовательский посредник. Эта посредническая функция заключается в,

 public void process(MessageContext mc) {
        String s = (String)mc.getProperty("data")).toString();
        ArrayList<String> list = new ArrayList<String>();     
        JSONArray jsonArray = new JSONArray(s); 
        if (jsonArray != null) { 
            int len = jsonArray.length();
            int len2 = 0;
            JSONArray j2;
            for (int i=0;i<len;i  ){ 
                j2 = new JSONArray(jsonArray.get(i));
                len2 = j2.length();
                for (int j=0;j<len2;j  ){ 
                    list.add(j2.get(j).toString());
                }
            } 
        } 
        mc.setProperty("data", list.toString());
    }
 

но когда я его использую, возникает ошибка. Есть ли какой — либо возможный способ сделать это. без использования пользовательского посредника.
В основном мое значение параметра «данные» выглядит примерно так,

 [
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}],
[{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]
]
 

что мне нужно после посредничества, так это,

 [
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'},
{'a1':12,'b1':'sd'},
        {'a1':12,'b1':'sd'}]
 

Пожалуйста, помогите мне.

Ответ №1:

Можете ли вы подтвердить, что вы получаете data запись в формате, принятом в формате JSON (с вложением двойных кавычек, а не одинарных кавычек)?

Например

 [
    [{"a1": 12,"b1": "sd"},{"a1": 12,"b1": "sd"}],
    [{"a1": 12,"b1": "sd"},{"a1": 12,"b1": "sd"}],
    [{"a1": 12,"b1": "sd"},{"a1": 12,"b1": "sd"}]
]
 

Если да, то измените указанную логику посредника класса следующим образом и опробуйте сценарий

 import java.util.ArrayList;

import org.apache.synapse.MessageContext;
import org.apache.synapse.commons.json.JsonUtil;
import org.apache.synapse.core.axis2.Axis2MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

public boolean mediate(MessageContext mc) {
    ...

    String dataBody = (String) mc.getProperty("data");

    ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
    JSONArray jArray = new JSONArray(dataBody);

    if (jArray != null) {
        int len = jArray.length();
        int len2 = 0;
        JSONArray jArray2;
        for (int i = 0; i < len; i  ) {
            jArray2 = jArray.getJSONArray(i);
            len2 = jArray2.length();
            for (int j = 0; j < len2; j  ) {
                listdata.add(jArray2.getJSONObject(j));
            }
        }
    }

    log.info("JSON Array: "   listdata.toString());
    JSONArray mod = new JSONArray(listdata);

    ...
}
 

Комментарии:

1. Спасибо вам за ответ. Я нашел другой способ сделать это без использования пользовательского посредника. В wso2 мы можем просто использовать json-eval($.data[ ][ ]) для преобразования списка списка в один список

2. Снова добавляем выражение JSON-Eval (без какого-либо формата): json-eval($.data[*][*])