Возможно, просто оставите поведение сериализации по умолчанию? Затем при десериализации вы все равно вытащите оболочку «employee», но при сериализации вы будете писать ее без оболочки.
ObjectMapper mapper = new ObjectMapper();
//mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
С вашим входом, я получил желаемый результат сериализации:
{"name":"abcd","id":"1234"}
EDIT
Что касается где поставить этот код, я бы рекомендовал одноплодный или класс со статическим методы, которые обрабатывают серию (de). У вас может быть два разных устройства, чем выполнение «нормального» или «завернутого» поведения. Вот набросок статического метода подхода:
public class SerializationUtil {
private static ObjectMapper normalObjectMapper;
private static ObjectMapper wrappedObjectMapper;
static {
/* configure different (de)serialization strategies */
normalObjectMapper = new ObjectMapper();
wrappedObjectMapper = new ObjectMapper();
wrappedObjectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
wrappedObjectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
}
public static <T> T normalDeserialize(String json, Class<T> clazz) throws Exception {
return normalObjectMapper.readValue(json, clazz);
}
public static String normalSerialize(Object bean) throws Exception {
return normalObjectMapper.writeValueAsString(bean);
}
public static <T> T deserializeWrappedObject(String json, Class<T> clazz) throws Exception {
return wrappedObjectMapper.readValue(json, clazz);
}
public static String serializeWrappedObject(Object bean) throws Exception {
return wrappedObjectMapper.writeValueAsString(bean);
}
}
Преимуществом этого метода является то, что позволяет абоненту решить поведение сериализации. Поэтому, если есть части вашего кода, где вам нужно обрабатывать его по-разному, вы можете вызвать другой метод. Обратите внимание, что обертывание/распаковка включены. Таким образом, чтобы получить желаемое поведение, вы могли бы назвать эти методы, как так:
public static void main(String[] args) {
Bean bean = SerializationUtil.deserializeWrappedObject(jsonInput, Bean.class);
String jsonOutput = SerializationUtil.normalSerialize(bean);
}
Если это не обращаюсь к вам, вы можете альтернативно обнаружить особый случай и обрабатывать его в том же вызове метода:
public static <T> T deserialize(String json, Class<T> clazz) throws Exception {
if (clazz instanceof Bean) {
return wrappedObjectMapper.readValue(json, clazz);
} else {
return normalObjectMapper.readValue(json, clazz);
}
}
В моем вопросе также спрашивается, куда поставить этот код картографа объекта, потому что, если я создам компонент, он применим ко всему проекту. Но я хочу только deserilisation в этом классе Sample, а не в любом другом классе. – sunder
@sunder Я обновил свой ответ. Это то, что вы ищете? – gregbert