Разделение строки Json и добавление объекта добавления в тело с помощью XML DSL на верблюде
В одном из моих вариантов использования мне нужно разбить входящее сообщение json на несколько сообщений на основе списка массивов, который доступен в сообщении.
например, в приведенном ниже сообщении будет выполнено разделение на основе списка массивов "actualData".
{
"information": {
"name": "ObjectName",
"type": "messageType"
},
"actualData": [
{
"msg": "message-1"
},
{
"msg": "message-2"
}
]
}
После того, как разделение выполнено, необходимо добавить объект "информация" в каждое сообщение, прежде чем отправлять его на следующий маршрут. эта работа должна выполняться в самом XML DSL без использования какого-либо Java-процессора или Java-кода.
Ожидаемый результат должен быть таким:
разделенное сообщение:1
{
"information": {
"name": "ObjectName",
"type": "messageType"
},
"actualData":
{
"msg": "message-1"
}
}
Разделить сообщение:2
{
"information": {
"name": "ObjectName",
"type": "messageType"
},
"actualData":
{
"msg": "message-2"
}
}
Постановка задачи:
Я могу разделить сообщение на основе объекта массива "actualData", но когда я пытаюсь добавить дополнительный объект в окончательное тело обмена, у меня возникают проблемы с преобразованием объекта json в строку с помощью jsonpath.
ниже приведен маршрут, который будет вызываться для каждого сообщения.
<route id="split_message">
<from uri="direct:split_message_onebyone"/>
<log message="Sending message body to split message one by one : ${body} "/>
<convertBodyTo type="java.lang.String"/>
<setProperty name="information">
<jsonpath resultType="String" writeAsString="true">$.information</jsonpath>
</setProperty>
<log message="printing property after string message body to split message one by one : ${exchangeProperty.information}} "/>
<split streaming="true">
<jsonpath>$.actualData</jsonpath>
<marshal> <custom ref="jack" /> </marshal>
<setBody>
<simple>{{"information" : ${exchangeProperty.information}}, "actualData" : ${body}, } </simple>
</setBody>
<convertBodyTo type="java.lang.String"/>
</split>
<log message="split end one by one ${body}"/>
</route>
Подход, который я здесь предпринял, заключался в том, что до того, как произойдет фактическое разделение, получить объект "информации" из исходного сообщения и сохранить его в свойстве обмена с именем "информация", а затем после того, как произошло разделение, передать это свойство из обмена и подготовить тело в котором создается json с объектами "информация" и "фактические данные".
все работает, как ожидалось, но проблема здесь в том, что когда объект "информация" сохраняется в поле свойства, он не сохраняется в виде строки, а не сохраняется, как показано ниже.
{
name: "ObjectName",
type: "messageType"
}
ожидается хранить, как показано ниже.
{
"name": "ObjectName",
"type": "messageType"
}
из-за этой проблемы окончательное тело сообщения не становится строкой json. Может ли кто-нибудь помочь решить эту проблему? Заранее спасибо. Я использую версию Camel 3.4.
2 ответа
Выполняйте сортировку после вашего ответа вместо преобразования в строку
Попробуйте Java DSL: .split().jsonpathWriteAsString("$")
или ЯМЛ:
- разделение:jsonpath:writeAsString: истинное выражение: «$»