Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Jackson JsonSerializer unum как несколько полей, а не объект json, как? / 6 сообщений из 6, страница 1 из 1
21.11.2021, 10:26
    #40113481
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Привет всем!

Есть объект с полем типа enum

Код: java
1.
2.
3.
4.
5.
6.
7.
@JsonSerialize(using = MyParamsSerializer.class)
class MyParams {
MyType type;
String fieldStr;
Integer fieldInt;
// ... ну и еще десятка 3-4 полей с типами разных объектов, мапами, листами и прочее :))
}



enum MyType
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public enum MyType {
TYPE_ONE("code1", "Tип 1"),
TYPE_TWO("code2", "Tип 2");

String code;
String description;

//... конструктор, геттеры

}



Делаем сериализатор:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class MyParamsSerializer extends JsonSerializer<MyParams> {
 @Override
    public void serialize(MyParams value, JsonGenerator gen, SerializerProvider provider) throws IOException {
 gen.writeStartObject();
 gen.writeStringField("code", value.getType().getCode());
 gen.writeStringField("description", value.getType().getDescription());
...
// сюда по идее нужно прописать все 3-4 десятка полей, но это плохо и неудобно, 
...
 gen.writeEndObject();
}




Вызываем в тесте String json = new ObjectMapper().writeValueAsString(экземпляр MyParams );
Нужно получить объект JSON вида:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
{
"code": "code1",
"description": "Tип 1",
"fieldStr": "Какая-то строка",
"fieldInt": 12345
... и еще куча полей и объектов 
}



По факту enum оборачивается в объект:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
{
"type": {
    "code": "code1",
    "description": "Tип 1",
},
"fieldStr": "Какая-то строка",
"fieldInt": 12345
... и еще куча полей и объектов 
}



Как вот поля енама поднять на уровень к полям основного объекта?
Если тупо убрать gen.writeStartObject(); и gen.writeEndObject(); то ошибка "Can not write a field name, expecting a value", что ожидаемо.
Можно аннотацию @JsonSerialize(using = MyParamsSerializer.class) поставить над полем енама и переписать, но это всё равно даст в результате объект, а не просто набор полей енама в json
Никак не нагуглю варианты и по докам, что-то толком не могу пока найти, а еще десиализатор надо будет потом добавлять :)
...
Рейтинг: 0 / 0
21.11.2021, 10:33
    #40113484
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Изначально объект содержал отдельно поля enum как свои поля, но при рефакторинге решил убрать их в enum, т.к. много где эти поля как параметры передаются, а хотелось бы сократить, да и задать какие-то значения в enum постоянные, чтобы использовать в других местах.
Т.е. менять модель на Фронте пока что нельзя, надо согласовывать, что долго, поэтому в код приехал сериализатор :)
Может другие решения уже есть?...
...
Рейтинг: 0 / 0
21.11.2021, 11:42
    #40113497
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Nixic
Можно аннотацию @JsonSerialize(using = MyParamsSerializer.class) поставить над полем енама и переписать, но это всё равно даст в результате объект, а не просто набор полей енама в json
Чет явно не то делаете, должно работать. А так есть еще JsonUnwrapped который вроде делает то что хочется
...
Рейтинг: 0 / 0
21.11.2021, 11:43
    #40113498
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Что ж.. пришлось вернуть поля в основной класс, и игнорить enum, а значения полей заполнять в конструкторе,
такое себе решение(временно-постоянное), но хотя бы не сломается использование этого класса другими сервисами и в каких-то там запросах...

Код: java
1.
2.
3.
this.paramType = paramType;
this.code = myType.getCode(); // из енама
this.description = myType.getDescription(); // из енама



Код: java
1.
2.
3.
4.
5.
class MyParams {
@JsonIgnore
MyType type;
... 
}



Но десериализацию нужно всё же кастомную запилить, чтобы из поля code enum определялся, ну это вроде как мелочи уже.
Всем, спасибо :))
...
Рейтинг: 0 / 0
21.11.2021, 11:44
    #40113499
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Андрей Панфилов,
Вот ведь :) Поторопился. Спасибо! Сейчас JsonUnwrapped посмотрю, вроде бы оно...
...
Рейтинг: 0 / 0
21.11.2021, 11:52
    #40113502
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jackson JsonSerializer unum как несколько полей, а не объект json, как?
Супер! Андрей, спасибо ещё раз, все развернулось положилось как надо, без всяких костылей :)
Интересно, а десериализация также гладко пройдёт... Сейчас тест напишу :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Jackson JsonSerializer unum как несколько полей, а не объект json, как? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]