Fastjson配置消息转换器(时间格式问题)

本文介绍了如何在Java项目中,通过添加FastJson依赖并配置WebConfig中的messageconverter,将ArticleListVO类中Date类型的createTime从默认的ISO-8601格式转换为yyyy-MM-ddHH:mm:ss格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

                

        我们可以看见,日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型,默认是由java的Jackson来处理,使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法,例如:"2023-07-21T06:53:24"。我们不希望时间被处理成这种格式,如下图。解决: 使用FastJson

第一步:需要添加fastjson的依赖到pom.xml

 <!--fastjson依赖-->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.33</version>
      </dependency>

第二步,在WebConfig里面编写fastjson消息转换器

package com.gjh.config;

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean//使用@Bean注入fastJsonHttpMessageConvert
    public HttpMessageConverter fastJsonHttpMessageConverters() {
        //1.需要定义一个Convert转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

        SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);

        fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
        fastConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastConverter;
        return converter;
    }

    @Override
    //配置消息转换器
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //增加我们的消息转换器
        converters.add(fastJsonHttpMessageConverters());
    }


}

第三步:重启,测试

                

可以看见,时间格式和我们配置的一样了

### FastAPI 中的时间解析、格式化及相关配置 在构建 API 使用 FastAPI 时,处理时间数据是一个常见的需求。为了确保应用程序能正确地解析和格式化时间戳,可以采取多种方法来实现这一目标。 #### 自定义 Pydantic 模型验证器 对于输入的数据模型,可以通过自定义 Pydantic 验证器来进行更精确的时间字符串转换。这允许开发者指定如何将传入的 `string` 类型字段转化为 Python 的 `datetime` 对象[^1]: ```python from datetime import datetime from pydantic import BaseModel, validator from typing import Optional class Item(BaseModel): timestamp: Optional[str] @validator('timestamp') def parse_timestamp(cls, v): try: return datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%fZ') if v else None except ValueError as e: raise ValueError(f'Invalid date format {v}') from e ``` 此代码片段展示了如何创建一个名为 `Item` 的 Pydantic 数据类,并为其添加了一个静态方法作为验证函数,该函数会尝试按照 ISO8601 标准解释给定的时间串;如果失败,则抛出异常提示错误消息。 #### 设置全局日期/时间序列化行为 当返回 JSON 响应时,默认情况下 Pydantic 将 `datetime` 实例转成 RFC3339 字符串形式。然而,在某些场景下可能希望调整这种默认的行为。为此可以在应用启动阶段通过修改 FastAPI 应用实例上的设置属性完成定制化的序列化逻辑[^3]: ```python import json from fastapi import FastAPI from fastapi.encoders import jsonable_encoder from starlette.responses import JSONResponse app = FastAPI() def custom_json_serializer(obj): """Custom serializer to handle datetime objects.""" if isinstance(obj, (datetime)): return obj.isoformat() return str(obj) @app.middleware("http") async def add_custom_serialization(request, call_next): response = await call_next(request) if isinstance(response, JSONResponse): content = json.dumps( jsonable_encoder(response.body), default=custom_json_serializer, ensure_ascii=False, ) response.body = content.encode('utf-8') return response ``` 上述中间件实现了对所有响应体内的 `datetime` 进行统一编码操作的功能,从而使得整个项目拥有一致性的输出样式。 #### 流式处理大文件中的时间信息 考虑到实际应用场景可能会涉及到大量记录或者长时间跨度的日志分析等情况,这时就需要考虑使用流的方式逐步读取并处理这些数据而不是一次性加载到内存中。借助像 `fast-csv` 这样的库可以帮助简化此类任务的操作流程[^2]: ```javascript const fs = require('fs'); const csv = require('fast-csv'); // 打开 CSV 文件进行逐行解析 csv.fromStream(fs.createReadStream('./data.csv')) .on('data', function(data){ console.log(`Row received at ${new Date().toISOString()}:`, data); }) .on('end', function(){ console.log('CSV file successfully processed.'); }); ``` 这段 Node.js 脚本演示了怎样利用事件驱动机制高效地遍历大型 CSV 文档的同时保持较低资源占用率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值