Как разделить массив входящих объектов Json в Spring XD?

Допустим, мои входящие данные представляют собой объект json или массив объектов json. Я хочу разделить входящие данные json, если это массив, чтобы я мог вставить их в коллекцию MongoDB (для простоты давайте пока просто войдем в консоль).

  1. Определить поток

    xd:>stream create splittest --definition "http | json-to-tuple | splitter | log" --deploy

  2. Опубликовать один объект

    xd:>http post --data "{\"dog\": \"чихуахуа\"}"

    21T09:05:59-0700 1.2.0.RELEASE INFO pool-44-thread-4 sink.splittest - {"собака":"чихуахуа"}

    Это ожидаемый результат, так как на входе был один объект - нечего разбивать.

  3. Опубликовать массив объектов

    xd:>http post --data "[{\"собака\":\"пудель\"}, {\"собака\": \"чихуахуа\"}, {\"собака\":\"пудель\" }]"

    21T09:43:05-0700 1.2.0.RELEASE INFO pool-44-thread-11 sink.splittest - {}

    В этом случае я ожидал увидеть три отдельных объекта собаки, напечатанных в каждой строке, но напечатал один пустой объект.

Что я делаю не так? Может кто-нибудь подсказать, что можно/нужно было сделать?


person nanaboo    schedule 21.10.2015    source источник
comment
Кажется, поскольку ваш обработчик POST отлично справляется с одной собакой, а не с массивом собак, ошибка заключается в коде, который обрабатывает запрос POST, а не в командах, которые отправляют указанный запрос. Если вы опубликуете этот код, я постараюсь вам помочь.   -  person awimley    schedule 21.10.2015
comment
Второй пост вернул 200 OK, и сервер не выдал никакой ошибки. Он напечатан точно так, как показано выше. И нет никакого кода для этого. Я сделал это, используя чистую интеграцию Spring, но я не хотел писать клиентский преобразователь и сплиттер для Spring XD. Я стараюсь максимально использовать готовые функции XD.   -  person nanaboo    schedule 21.10.2015
comment
Извините, я недостаточно знаком с Spring XD, чтобы помочь.   -  person awimley    schedule 21.10.2015


Ответы (1)


Разобрался как это сделать. Мне не нужно было использовать процессор json-to-tuple.

xd:>stream create splittest2 --definition "http | splitter --expression=#jsonPath(payload,'$.[*]') | log" --deploy

xd:>http post --data "[{\"dog\": \"poodle\"}, {\"dog\": \"chihuahua\"}, {\"dog\":\"poodle\"}]"

2015-10-21T10:52:31-0700 1.2.0.RELEASE INFO pool-83-thread-4 sink.splittest2 - {dog=poodle}
2015-10-21T10:52:31-0700 1.2.0.RELEASE INFO pool-83-thread-4 sink.splittest2 - {dog=chihuahua}
2015-10-21T10:52:31-0700 1.2.0.RELEASE INFO pool-83-thread-4 sink.splittest2 - {dog=poodle}

Таким образом, он работает с несколькими объектами, однако он не обрабатывает один объект, как я ожидал.

xd:>http post --data "{\"dog\":\"chihuahua\"}"
2015-10-21T10:56:11-0700 1.2.0.RELEASE INFO pool-83-thread-10 sink.splittest2 - chihuahua
person nanaboo    schedule 21.10.2015
comment
Может этот $..*? - person Artem Bilan; 21.10.2015
comment
Достаточно близко. Он разбивает массив (это то, что я хочу) И разбивает каждую собаку. - person nanaboo; 21.10.2015
comment
sin.splittest2 - {собака=пудель} sin.splittest2 - {собака=чихуахуа} sin.splittest2 - {собака=пудель} sin.splittest2 - пудель - person nanaboo; 21.10.2015