Разделение строки 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: истинное выражение: «$»
Другие вопросы по тегам