使用 jackson序列格式化日期

本文介绍了如何在Java中自定义时间序列化类,将日期对象转换为特定格式的字符串,并展示了如何在POJO类上使用序列化注解。同时强调了实现序列化接口的必要性。

【1】自定义时间,序列化类

package com.fsti.bm.utils;

import java.io.IOException;
import java.util.Date;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

/**
 * 自定义时间,序列化类
 * 
 * yyyy-MM-dd hh:mm:ss
 * 
 * @author deniro
 */
public class CustomDateSerializer extends JsonSerializer<Date> {

	@Override
	public void serialize(Date value, JsonGenerator jgen,
			SerializerProvider provider) throws IOException,
			JsonProcessingException {
		jgen.writeString(DateUtils.toStr(value));

	}
}

【2】POJO添加序列化注解

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fsti.bm.utils.CustomDateSerializer;

@JsonSerialize(using = CustomDateSerializer.class)

注意:该类必须实现 java.io.Serializable


如果使用hibernate,则hbm配置文件相应的字段类型,必须是 type="timestamp"

<think>我们之前已经介绍了Jackson的基本使用和示例,现在用户询问的是“jackson 序列化格式”,所以重点在于Jackson序列化过程中支持的格式以及如何控制序列化的输出格式。 序列化格式涉及多个方面,比如日期格式、空值处理、字段顺序、缩进等。此外,Jackson不仅支持JSON格式,还支持其他数据格式(如XML、YAML等),但用户没有特别指明,我们默认以JSON序列化格式为主,并提及其他格式的支持。 回答结构: 1. 介绍Jackson序列化格式的基本概念,以及如何通过配置和注解控制序列化格式。 2. 提供一些常见格式控制的示例,如日期格式化、空值忽略、字段排序等。 3. 简要提及其他格式(如XML、YAML)的序列化。 注意:用户要求使用中文回答,并在最后提出3-5个相关问题。 由于之前已经使用过代码块,这里我们继续使用代码块展示示例。 最后,按照要求,在回答末尾输出“§§相关问题§§”并列出3-5个相关问题。 </think>### Jackson 序列化格式详解与配置 Jackson 通过 `ObjectMapper` 提供高度灵活的序列化格式控制,以下是核心配置方式和常用格式示例: #### 🔧 核心配置方法 ```java ObjectMapper mapper = new ObjectMapper(); // 1. 美化输出(缩进格式化) mapper.enable(SerializationFeature.INDENT_OUTPUT); // 2. 空值处理 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略null字段 // 3. 日期格式全局设置 mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 4. 字段排序控制 mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); ``` --- #### 常用序列化格式示例 **1. 基础 JSON 格式** ```java User user = new User("张三", 25); String json = mapper.writeValueAsString(user); // 输出: {"name":"张三","age":25} ``` **2. 美化格式化输出** ```java mapper.enable(SerializationFeature.INDENT_OUTPUT); String prettyJson = mapper.writeValueAsString(user); /* 输出: { "name" : "张三", "age" : 25 } */ ``` **3. 自定义字段格式(注解控制)** ```java public class Product { @JsonProperty("product_name") // 修改字段名 private String name; @JsonFormat(shape = JsonFormat.Shape.STRING) // 数值转字符串 private BigDecimal price; @JsonInclude(Include.NON_EMPTY) // 空集合不显示 private List<String> tags; } ``` **4. 排除字段的三种方式** ```java // 方式1: 注解忽略 @JsonIgnore private String password; // 方式2: 类型混合 mapper.addMixIn(User.class, UserMixIn.class); public abstract class UserMixIn { @JsonIgnore abstract String getPassword(); } // 方式3: 动态过滤 mapper.setFilterProvider(new SimpleFilterProvider() .addFilter("pwdFilter", SimpleBeanPropertyFilter.serializeAllExcept("password"))); ``` --- #### 🌐 支持的其他序列化格式 | **格式** | **依赖** | **启用方式** | |----------|------------------------|----------------------------------| | **XML** | jackson-dataformat-xml | `new XmlMapper()` | | **YAML** | jackson-dataformat-yaml | `new YAMLFactory().createMapper()` | | **CSV** | jackson-dataformat-csv | `new CsvMapper()` | **XML 序列化示例** ```java XmlMapper xmlMapper = new XmlMapper(); String xml = xmlMapper.writeValueAsString(user); // 输出: <User><name>张三</name><age>25</age></User> ``` --- #### ⚠️ 特殊格式处理技巧 1. **枚举序列化为名称/序号** ```java public enum Status { @JsonValue // 序列化为描述文本 ACTIVE("启用"), DISABLED("停用"); private final String desc; } ``` 2. **自定义序列化器** ```java public class PhoneSerializer extends StdSerializer<String> { protected PhoneSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator gen, SerializerProvider provider) { gen.writeString(value.substring(0,3) + "****" + value.substring(7)); } } // 应用: @JsonSerialize(using = PhoneSerializer.class) private String phone; ``` > 💡 **性能提示**: > - 使用 `@JsonCreator` 构造函数反序列化提升 40% 性能 > - 禁用 `SerializationFeature.WRITE_DATES_AS_TIMESTAMPS` 避免时间戳格式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值