Доступ к данным из тела JSON внутри Apache Camel - PullRequest
0 голосов
/ 25 июня 2018

Я работаю с API, который в основном позволяет осуществлять навигацию по файловой системе.Я пытаюсь получить доступ к данным из возвращенного JSON через API, чтобы выполнить функцию над ним.

Ниже приведен код, которым я пользуюсь для доступа к API.Я попытался использовать unmarshal для преобразования JSON, возвращенного в карту.

from("timer://foo?fixedRate=true&period=120000")
    .log("Checking for files")
    .setHeader("Authorization", simple(myHttp.getAuth()))
    .setHeader("CamelHttpMethod", constant("GET"))
    .to(myHttp.getFullRequest())
    .unmarshal(new JacksonDataFormat(Map.class)).log("${body}");

, который возвращает мне эти данные:

{
    objects=[
    {
        name=file1.csv,
        type=file
    },
    {
        name=dir1,
        type=directory,
    },
    {
        name=dir2,
        type=directory
    },
    {
        name=dir3,
        type=directory
    },
    {
        name=dir4,
        type=directory
    }]
}

Я хочу получить доступ к массиву в разделе «объекты», чтобы проверить, существуют ли какие-либо файлы в этом каталоге.До сих пор я пытался регистрировать данные только под объектами и поэтому использовал этот код:

   .unmarshal(new JacksonDataFormat(Map.class)).log("${body.objects}");

Используя $ {body.objects}, я все еще не могу получить доступ к данным внутри MAP.Я ожидал, что будет возвращено что-то подобное:

        [{
            name=file1.csv,
            type=file
        },
        {
            name=dir1,
            type=directory,
        },
        {
            name=dir2,
            type=directory
        },
        {
            name=dir3,
            type=directory
        },
        {
            name=dir4,
            type=directory
        }]

, но вместо этого я получаю эту ошибку:

Метод с именем: объекты не найдены в bean-компоненте: {objects = [{name= file1.csv, тип = файл}, {имя = dir1, тип = каталог}, {имя = dir2, тип = каталог}, {имя = dir3, тип = каталог}, {имя = dir4, тип = каталог}]} типа: java.util.LinkedHashMap.Exchange [ID-IT1289-1529914067957-0-1]

Получаю ли я доступ к возвращенной MAP после неправильного использования unmarshall?Какой правильный синтаксис я должен использовать, если это так?

Я видел другие примеры демаршаллинга ... но я не могу полностью понять.Я заметил, что во многих примерах используется класс со структурой JSON.Это необходимо?Если мое тело в настоящее время имеет тип: java.util.LinkedHashMap, я ожидаю, что это не должно быть проблемой для доступа, но я не могу найти способ.

Заранее спасибо

1 Ответ

0 голосов
/ 25 июня 2018

Лучший способ сделать это - создать класс, соответствующий вашей структуре Json.

class RestResponse {
   List<FileNameType> objects;
   //Getters and Setters
}

class FileNameType {
  String name;
  String type;
  //Getters and setters.
}

Тогда измените свой маршрут следующим образом

from("timer://foo?fixedRate=true&period=120000")
    .log("Checking for files")
    .setHeader("Authorization", simple(myHttp.getAuth()))
    .setHeader("CamelHttpMethod", constant("GET"))
    .to(myHttp.getFullRequest())
    .unmarshal().json(JsonLibrary.Jackson, RestResponse.class)
    .to(....);

В последней части я оставил это поле пустым, здесь вы можете добавить процессор для проверки вашей логики. Вы можете получить объект RestResponse от exchange.getIn().getBody(). Нечто подобное может сделать

........
.unmarshal().json(JsonLibrary.Jackson, RestResponse.class)
.process(exchange -> {

              RestResponse response = exchange.getIn().getBody(RestResponse.class);
               // Do your logic here.

  })

Возможно, вам понадобится добавить эту зависимость

<dependency>
       <groupId>org.apache.camel</groupId>
       <artifactId>camel-jackson</artifactId>
       <version>yourcamelversion</version>
 </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...