您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

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

不忘初心 不忘初心 2019-06-04 围观() 评论() 点赞() JAVA开发

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

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的方式来进行配置。

json

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们