Как прочитать строку JSON из файла в Mule 4

Я пытаюсь создать тест MUnit, который имитирует HTTP-запрос, устанавливая полезную нагрузку на объект JSON, который я сохранил в файле. В Mule 3 я бы просто сделал getResource('fileName.json').asString(), и это отлично сработало. Однако в Mule 4 я не могу статически вызывать getResource.

Я нашел сообщение на форуме Mulesoft, в котором предлагалось использовать MunitTools::getResourceAsString. Когда я запускаю свой тест, я вижу объект JSON, но со всеми символами \n и \r, а также \ без кавычек. Очевидно, это означает, что мой JSON больше не правильно сформирован.

В идеале я хотел бы найти ссылку на MunitTools, чтобы я мог видеть список функций, которые я могу вызывать, и, возможно, найти ту, которая не добавляет escape-символы, но мне не повезло. Если кто-нибудь знает какой-либо справочный документ, на который я могу сослаться, пожалуйста, дайте мне знать.

Не имея возможности найти способ вернуть данные без дополнительных символов, я попытался заменить их через dataweave. Это нормально при замене \n и \r, но поскольку есть еще \ перед каждой двойной кавычкой, и я не могу избавиться от них.

Если я сделаю это ...

replace (/\/) with ("")

... я получаю сообщение об ошибке. Сотрудник предложил настроить таргетинг на каждый \" и заменить их на ", но это проблема, потому что это дает мне """. Чтобы обойти это, я пробовал

replace(/\"/) with "\""

... который не вызывает никаких ошибок, но по какой-то причине он читает \ как литерал, поэтому заменяет исходную строку собой. Я также пробовал ... заменить (/ \ "/) на '"' ... но это тоже приводит к ошибке

Я открыт и для любых других решений.

Спасибо

--Рисовал


person Drew Ingram    schedule 20.06.2019    source источник


Ответы (2)


У меня были те же опасения, поэтому я начал использовать метод readUrl(). Это метод DataWeave, поэтому вы сможете использовать его в любом процессоре MUnit. Вот пример того, как я использовал его в установленном обработчике событий. Он читает файл JSON, а затем конвертирует его в Java для моих собственных нужд, но вы можете просто заменить java на JSON для своих нужд.

<munit:set-event doc:name="Set Event" doc:id="e7b1da19-f746-4964-a7ae-c23aedce5e6f" >
        <munit:payload mediaType="application/java" value="#[output application/java --- readUrl('classpath://singleItemRequest.json','application/json')]"/>
</munit:set-event>

Вот документация для readUrl https://docs.mulesoft.com/mule-runtime/4.2/dw-core-functions-readurl

Надеюсь, это поможет!

person maloney77    schedule 02.08.2019
comment
Мул 4.2.1. Вот как это работает для меня, что соответствует этому ответу: ‹munit-tools: variables› ‹munit-tools: variable key = history mediaType = application / json encoding = UTF-8 value = '# [output application / json - - readUrl (classpath: //rim0to2-changed/3-member-history.json, application / json)] '/ ›‹ / munit-tools: переменные › - person Sergei G; 08.02.2020

Следуйте этому фрагменту (а точнее тегу munit-tools:then-return):

<munit-tools:mock-when doc:name="Mock GET /users" doc:id="89c8b7fb-1e94-446f-b9a0-ef7840333328" processor="http:request" >
    <munit-tools:with-attributes >
        <munit-tools:with-attribute attributeName="doc:name" whereValue="GET /users" />
    </munit-tools:with-attributes>
    <munit-tools:then-return>
        <munit-tools:payload value="#[read(MunitTools::getResourceAsString('examples/responses/anypoint-get-users-response.json'), &quot;application/json&quot;)]" />
    </munit-tools:then-return>
</munit-tools:mock-when>

Он имитирует HTTP-запрос и возвращает объект JSON с помощью функции read().

person Christian Bartolo    schedule 20.09.2019