Как (де) сериализовать поле из объекта на основе аннотации с использованием Джексона?
Мне нужно настроить Джексона определенным образом, который яопишу ниже.
ТребованияАннотированные поля сериализуются только с их идентификатором:Если поле является нормальным объектом, сериализуйте егоid
Если поле является коллекцией объектов, сериализуйте массивid
Аннотированные поля по-разному сериализуют имена своих свойств:Если поле является нормальным объектом, добавьте"_id"
суффикс к имени свойстваЕсли поле является коллекцией объектов, добавьте"_ids"
суффикс к имени свойстваДля аннотации я думал что-то вроде обычая@JsonId
в идеале с необязательным значением для переопределения имени, как@JsonProperty
делаетСвойство id должно быть определено пользователем, либо используя:Уже существующий джексон@JsonIdentityInfo
Или путем создания другого класса или аннотации поляИли, решив, какую аннотацию проверитьid
обнаружение свойств (полезно, например, для сценариев JPA)Объекты должны быть сериализованы с обернутым корневым значениемНазвания верблюжьих букв должны быть преобразованы в нижний регистр с подчеркиваниемВсе это должно быть десериализуемо (путем создания экземпляра только с установленным идентификатором)ПримерУчитывая эти POJO 's:
//Inform Jackson which property is the id
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public abstract class BaseResource{
protected Long id;
//getters and setters
}
public class Resource extends BaseResource{
private String name;
@JsonId
private SubResource subResource;
@JsonId
private List subResources;
//getters and setters
}
public class SubResource extends BaseResource{
private String value;
//getters and setters
}
Возможная сериализацияResource
экземпляр может быть:
{
"resource":{
"id": 1,
"name": "bla",
"sub_resource_id": 2,
"sub_resource_ids": [
1,
2,
3
]
}
}
До сих пор...требование# 5 может быть достигнуто путем настройкиObjectMapper
следующим образом:
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
А затем с помощью@JsonRootName("example_root_name_here")
в моем POJO 's.
требование# 6 может быть достигнуто путем настройкиObjectMapper
следующим образом:
objectMapper.setPropertyNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
Как вы можете видеть, есть еще много требований для выполнения. Для тех, кому интересно, зачем мне такая конфигурация,потому что яЯ разрабатываю веб-сервис REST дляember.js (точнее, Ember Data). Вы были бы очень признательны, если бы вы могли помочь с любым из требований.
Спасибо!