首页   >   代码编程   >   JAVA开发

jackson自定义序列化器,指定返回对象中的某个字段

Jackson提供了自定义序列化器的方式,可以很方便的处理我们想要的json格式,例如:“接口返回的数据中包含User对象,但是我只想用User对象中的name属性,但是又不想在返回的数据模型中重新定义一个冗余字段”,此时就可以使用自定义的序列化器来解决了。

可能大家还不太明白啥意思,来张图感受下:

jackson自定义序列化器,指定返回对象中的某个字段

也就是说,json数据中,user对象的就是一个字符串,我不想要一个对象,只想要{user: "张三"}这种格式。

本案例以springboot项目来做演示,总共分为两步:

1、继承JsonSerializer,实现serialize方法;

2、将自定义的serializer添加到SimpleModule中,并利用ObjectMapper注册进来;

不多哔哔,直接上代码了:

class TestVO {
    private String title;
    private String desc;
    private User user;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

自定义序列化器:

package com.wolffy.reader.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.wolffy.reader.entity.User;

import java.io.IOException;

/**
 * Created by Felix on 2019/05/10.
 */
public class UserJsonSerializer extends JsonSerializer<User> {

    @Override
    public void serialize(User user, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (user != null) {
            jsonGenerator.writeString(user.getNickName());
        } else {
            jsonGenerator.writeString("");
        }
    }

}

json配置:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    List<MediaType> supported = new ArrayList<>();
    supported.add(MediaType.APPLICATION_JSON_UTF8);
    mappingJackson2HttpMessageConverter.setSupportedMediaTypes(supported);

    // JsonMapper
    ObjectMapper objectMapper = new ObjectMapper();
    // null值的处理,必须要放在第一步,否则会将下面的日期格式化覆盖掉
    // null ==> ""
    objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString("");
        }
    });
    // 不认识的属性,不抛异常
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // 处理默认日期格式化:yyyy-MM-dd HH:mm:ss
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.setDateFormat(new SimpleDateFormat(Constants.TIME_PATTERN));

    // 将对象中的某一个值返回出去,这种写法,与上面的setDateFormat效果一样
    SimpleModule module = new SimpleModule();
    module.addSerializer(Date.class, new DateJsonSerializer());
    objectMapper.registerModule(module);

    mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);

    return mappingJackson2HttpMessageConverter;
}

来做一个测试:

package com.wolffy.reader.controller;

import com.wolffy.reader.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by Felix on 2019/05/13.
 */
@Controller
public class TestController {

    @RequestMapping(value = "/test/json")
    @ResponseBody
    public TestVO testJson() {
        TestVO testVO = new TestVO();
        testVO.setTitle("test");
        testVO.setDesc("test-desc");

        User user = new User();
        user.setNickName("张三");

        testVO.setUser(user);
        return testVO;
    }

}

访问一下看看效果:

jackson自定义序列化器,指定返回对象中的某个字段

搞定收工!

springmvc中也是差不多的写法,只不过是用xml的方式来进行配置。

QQ群: 686430774

站长Q: 1347384268

分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-06-04

永久地址:https://www.jiweichengzhu.com/article/94969cc1afff496dbeed3160ae0dd8b6

评论