@JsonSerialize和JsonSerializer的用法

DCK*_*ing 12 spring-mvc jackson

问题

我有一个Spring MVC应用程序,它要求我将某个实体列表的id和名称转换为具有特定格式的JSON对象数组,并在特定请求中输出该ID.也就是说,我需要一个像这样的JSON对象数组:

{
     label: Subject.getId()
     value: Subject.getName()
}
Run Code Online (Sandbox Code Playgroud)

为了便于使用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();
    }

}
Run Code Online (Sandbox Code Playgroud)

然而,我回来的JSON是Jackson推断的默认序列化.我的自定义序列化程序似乎完全被忽略了.显然问题是@JsonSerialize或JsonSerializer的使用不正确,但我无法在任何地方找到这些内容的正确用法.

使用Jackson实现我想要的序列化的正确方法是什么?请注意,重要的是实体在此上下文中以这种方式序列化,并在其他地方对其他序列化开放

hen*_*ren 8

@JsonSerialize应该在被序列化的类而不是控制器上设置.

  • 我会跳过序列化程序,只是使用@JsonProperty("label")为id注释Subject类中的属性,为@JsonProperty("value")注释名称 (2认同)