Как извлечь массив JSON из json в mulesoft

Я получаю вывод xml, затем я конвертирую этот xml в объект json. Формат приведен ниже.

{
"SOAP-ENV:Envelope": {
    "@xmlns:SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
    "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
    "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
    "SOAP-ENV:Body": {
        "rpc:TestExampleResponse": {
            "@xmlns:rpc": "http://Test.com/asi/",
            "TestMessage": {
                "listOfTESTS": {
                    "@xmlns:xmlns": "http://www.Test.com/xml/TEST",
                    "TESTS": [{
                            "id": "1",
                            "lastSyncDate": "12/16/2015 07:06:38",
                            "listOfTESTsyncrealtimeChild": null
                        }, {
                            "id": "2",
                            "lastSyncDate": "12/16/2015 07:06:38",
                            "listOfTESTsyncrealtimeChild": null
                        }

                    ]
                }
            }
        }
    }
 }
}

Я хочу извлечь тестовый массив из вывода JSON в Mulesoft. Я не знаю, как извлечь этот массив в mulesoft. Заранее спасибо


person Rahul Vijay    schedule 07.01.2016    source источник
comment
Я попробовал Xpath, но получил следующую ошибку. Не удалось выполнить выражение xpath3('/SOAP-ENV:Envelope',payload,'STRING'). (org.mule.api.expression.ExpressionRuntimeException). Полезная нагрузка сообщения имеет тип: String   -  person Rahul Vijay    schedule 07.01.2016
comment
Вы не можете использовать XPATH, потому что полезная нагрузка не в формате XML. Вы можете найти мой ответ полезным   -  person Ram Bavireddi    schedule 07.01.2016


Ответы (2)


Вы можете использовать Dataweave (компонент Transform Message в Anypoint Studio)

(Мул EE)

Взгляните на документацию:

https://docs.mulesoft.com/mule-user-guide/v/3.7/using-dataweave-in-studio

Пример сценария для вашего ввода:

%dw 1.0
%input payload application/json
%output application/json
---
TESTS: payload."SOAP-ENV:Envelope"."SOAP-ENV:Body"."rpc:TestExampleResponse".TestMessage.listOfTESTS.TESTS map ((tEST , indexOfTEST) -> {
        id: tEST.id,
        lastSyncDate: tEST.lastSyncDate,
        listOfTESTsyncrealtimeChild: tEST.listOfTESTsyncrealtimeChild
})

Вывод при использовании %output application/json:

{
  "TESTS": [
    {
      "id": "1",
      "lastSyncDate": "12/16/2015 07:06:38",
      "listOfTESTsyncrealtimeChild": null
    },
    {
      "id": "2",
      "lastSyncDate": "12/16/2015 07:06:38",
      "listOfTESTsyncrealtimeChild": null
    }
  ]
}

Вывод при использовании %output application/java:

{TESTS=[{id=1, lastSyncDate=12/16/2015 07:06:38, listOfTESTsyncrealtimeChild=null}, {id=2, lastSyncDate=12/16/2015 07:06:38, listOfTESTsyncrealtimeChild=null}]}
person DavoCoder    schedule 07.01.2016

Вы можете написать собственный преобразователь, как показано ниже. Этот преобразователь использует зависимость Jackson (com.fasterxml.jackson).

Преобразователь возвращает список строк, где каждая строка представляет элемент вашего массива TESTS.

public class JsonArrayExtractor extends AbstractTransformer {

    private final ObjectMapper mapper = new ObjectMapper();
    private final String testsNodeJsonPointer = "/SOAP-ENV:Envelope/SOAP-ENV:Body/rpc:TestExampleResponse/TestMessage/listOfTESTS/TESTS";

    public JsonArrayExtractor() {
        registerSourceType(DataTypeFactory.STRING);
    }

    @Override
    protected Object doTransform(Object src, String enc) throws TransformerException {
        String payload = Objects.toString(src);

        JsonNode root;
        try {
            root = mapper.readTree(payload);
        } catch (IOException e) {
            throw new TransformerException(this, e);
        }

        List<String> testsList = new ArrayList<>();

        JsonNode testsNode = root.at(JsonPointer.valueOf(testsNodeJsonPointer));
        if (testsNode instanceof ArrayNode) {
            ArrayNode testsArrayNode = (ArrayNode) testsNode;
            for (JsonNode test : testsArrayNode) {
                testsList.add(test.toString());
            }
        }
        return testsList;
    }
}

И вы можете использовать вышеуказанный преобразователь в своем потоке, как показано ниже.

<custom-transformer class="org.ram.JsonArrayExtractor" doc:name="extractTestsArray"/>
person Ram Bavireddi    schedule 07.01.2016