Использование @JsonSerialize и JsonSerializer - PullRequest
12 голосов
/ 09 августа 2011

Задача

У меня есть приложение Spring MVC, которое требует от меня преобразования идентификаторов и имен списка определенной сущности в массив объектов JSON с определенным форматированием и вывода его по определенному запросу. То есть мне нужен массив объектов JSON, таких как:

{
     label: Subject.getId()
     value: Subject.getName()
}

Для удобства использования с плагином jQuery Autocomplete.

Итак, в моем контроллере я написал следующее:

@RequestMapping(value = "/autocomplete.json", method = RequestMethod.GET)
@JsonSerialize(contentUsing=SubjectAutocompleteSerializer.class)
public @ResponseBody List<Subject> autocompleteJson() {
    return Subject.findAllSubjects();
}

// Internal class
public class SubjectAutocompleteSerializer extends JsonSerializer<Subject> {

    @Override
    public void serialize(Subject value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeStringField("label", value.getId().toString());
        jgen.writeStringField("value", value.getName());
        jgen.writeEndObject();
    }

}

JSON, который я получаю, однако, является сериализацией по умолчанию, выведенной Джексоном. Мой пользовательский сериализатор, похоже, полностью игнорируется. Очевидно, что проблема заключается в неправильном использовании @JsonSerialize или JsonSerializer, но я нигде не смог найти правильного их использования в контексте.

Вопрос

Как правильно использовать Джексона для достижения желаемой сериализации? Обратите внимание, что важно, чтобы объекты только сериализовались таким образом в этом контексте и были открыты для других сериализаций в других местах

1 Ответ

8 голосов
/ 09 августа 2011

@ JsonSerialize должен быть установлен для сериализуемого класса, а не контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...