首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@ JsonSerializer和JsonSerializer的使用

@ JsonSerializer和JsonSerializer的使用
EN

Stack Overflow用户
提问于 2011-08-08 21:18:51
回答 2查看 31K关注 0票数 14

问题

我有一个Spring应用程序,它要求我将特定实体列表的id和名称转换为具有特定格式的JSON对象数组,并根据特定请求输出。也就是说,我需要一个JSON对象数组,如下所示:

代码语言:javascript
复制
{
     label: Subject.getId()
     value: Subject.getName()
}

为方便使用jQuery自动完成插件。

因此,在我的控制器中,我写了以下内容:

代码语言:javascript
复制
@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来实现我想要的序列化的正确方法是什么?请注意,重要的是实体只能在这种情况下以这种方式序列化,并在其他地方向其他序列化开放

EN

回答 2

Stack Overflow用户

发布于 2011-08-09 12:16:12

@JsonSerialize应该设置在正在序列化的类上,而不是控制器上。

票数 9
EN

Stack Overflow用户

发布于 2019-08-14 10:41:56

@JsonSerialize应该设置在正在序列化的类上,而不是控制器上。

我想把我的两分钱(用例例子)加到上面的答案中.您不能总是为特定类型指定json序列化程序,特别是如果这是泛型类型(擦除不允许在运行时为特定泛型选择序列化程序),但是始终可以创建新类型(如果序列化类型是最终的且不能扩展,则可以扩展广义类型或创建包装器)和该类型的自定义JsonSerializer。例如,您可以这样做来序列化不同的org.springframework.data.domain.Page类型:

代码语言:javascript
复制
@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);
    }
}

然后,您可以从服务的方法返回您的类型-所需的序列化程序将被明确地使用:

代码语言:javascript
复制
@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());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6988746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档