问题
我有一个Spring应用程序,它要求我将特定实体列表的id和名称转换为具有特定格式的JSON对象数组,并根据特定请求输出。也就是说,我需要一个JSON对象数组,如下所示:
{
label: Subject.getId()
value: Subject.getName()
}为方便使用jQuery自动完成插件。
因此,在我的控制器中,我写了以下内容:
@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是Jackson推断的默认序列化。我的自定义序列化程序似乎完全被忽略了。显然,问题是@ JsonSerializer或JsonSerializer的用法不正确,但我在任何地方都找不到正确的使用。
问题
使用Jackson来实现我想要的序列化的正确方法是什么?请注意,重要的是实体只能在这种情况下以这种方式序列化,并在其他地方向其他序列化开放
发布于 2011-08-09 12:16:12
@JsonSerialize应该设置在正在序列化的类上,而不是控制器上。
发布于 2019-08-14 10:41:56
@JsonSerialize应该设置在正在序列化的类上,而不是控制器上。
我想把我的两分钱(用例例子)加到上面的答案中.您不能总是为特定类型指定json序列化程序,特别是如果这是泛型类型(擦除不允许在运行时为特定泛型选择序列化程序),但是始终可以创建新类型(如果序列化类型是最终的且不能扩展,则可以扩展广义类型或创建包装器)和该类型的自定义JsonSerializer。例如,您可以这样做来序列化不同的org.springframework.data.domain.Page类型:
@JsonComponent
public class PageOfMyDtosSerializer
extends JsonSerializer<Page<MyDto>> {
@Override
public void serialize(Page<MyDto> page,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException {
//...serialization logic for Page<MyDto> type
}
}
@JsonSerialize(using = PageOfMyDtosSerializer.class)
public class PageOfMyDtos extends PageImpl<MyDto> {
public PageOfMyDtos(List<MyDto> content, Pageable pageable, long total) {
super(content, pageable, total);
}
}然后,您可以从服务的方法返回您的类型-所需的序列化程序将被明确地使用:
@Service
@Transactional
public class MyServiceImpl implements MyService {
...
@Override
public Page<UserProfileDto> searchForUsers(
Pageable pageable,
SearchCriteriaDto criteriaDto) {
//...some business logic
/*here you pass the necessary search Specification or something else...*/
final Page<Entity> entities = myEntityRepository.findAll(...);
/*here you goes the conversion logic of your choice...*/
final List<MyDto> content = modelMapper.map(entieis.getContent(), new TypeToken<List<MyDto>>(){}.getType());
/*and finally return your the your new type so it will be serialized with the jsonSerializer we have specified*/
return new PageOfMyDtos(content, pageable, entities.getTotalElements());
}
}https://stackoverflow.com/questions/6988746
复制相似问题