Отображение атрибутов Java POJO

У меня есть прецедент, когда я получаю некоторые атрибуты в запросе вроде этого,

"filters": [
  {
    "field": "fName",
    "value": "Tom"
  },
  {
    "field": "LName",
    "value": "Hanks"
  }
]

У меня нет модели, определенной для этого. Я просто получаю эти атрибуты в запросе и запускаю запрос об упругом поиске, используя эти атрибуты. Мои записи в упругом поиске имеют одинаковые имена атрибутов.

Теперь я должен поддерживать устаревшее приложение, где имена атрибутов совершенно разные. Например: fName становится firstName и lName становится lastName.

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

ПРИМЕЧАНИЕ. У меня нет POJO для этих записей.

Как это можно добиться эффективно? Я думал об использовании компоновщика Orika, но не уверен, как это будет работать, не определяя сначала классы.

Ответ 1

Что мешает вам написать трансформатор от запроса JSON к вашему нормализованному JSON?

Нормальный поток, о котором я могу думать, таков:

Request JSON -> POJO -> POJO with normalized value -> Normalized JSON

Итак, ваш POJO выглядит так:

public class Filter {

     List<FieldFilter> filters;

     public static class FieldFilter {
         private String field;
         private String value;
     }
}

Теперь у вас будет карта преобразования, например:

Map<String, String> fieldNameMapping = new HashMap<>();
fieldNameMapping.put("fName", "firstName");
fieldNameMapping.put("firstName", "firstName");

// The process of populating this map can be done either by a static initializer, or config/properties reader

Затем вы преобразуете POJO:

Filter filterRequest;
List<FieldFilters> normlizedFilters = 
    filterReq.getFilters().stream()
             .map(f -> new FieldFilter(fieldNameMapping.get(f.getField()), f.getValue())
             .collect(toList());

Затем преобразуйте класс Filter в ваш нормализованный JSON.

Ответ 2

У нас есть аналогичный сценарий, и мы используем apache JOLT. Если вы хотите попробовать несколько образцов, вы можете обратиться к jolt-demo-online-utility

Ответ 3

Вместо этого используйте JSON для JSON-трансформатора. Хорошие ответы на это можно найти здесь: JSON to JSON transformer и здесь: эквивалент XSLT для JSON

В конце вам не нужен тип промежуточного объекта. Вы даже сказали, что у вас еще нет такого типа, и изобретать его, просто чтобы преобразовать его, на самом деле не имеет смысла.