把返回的json 集合中,有关时间类型的字段,转化为指定格式的的字段

本文介绍如何使用自定义的JsonDateValueProcessorUtil类,将Java项目中返回的JSON数据中的日期字段,从默认的复杂格式转换为更易读的指定格式,如yyyy-MM-dd HH:mm:ss。

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

1 在项目开发的工程中,有的实体bean 中,会包含java.util.Date这个类型的字段,在我们返回的json 集合中,如果包括这样的实体,时间类型的字段,默认是返回这样的格式,{"nanos":0,"time":-27076233600000,"minutes":0,"seconds":0,"hours":0,"month":11,"timezoneOffset":-480,"year":-789,"day":5,"date":22},如果返回这样的格式,非常晦涩难懂,怎么才能返回成指定的格式呢?下面将为大家一一说明

2 首先 我们新建一个,时间转化器工具类,时间转换器工具类的作用,将返回的json数据中的日期格式转换为指定格式。

3 新建一个时间转换器工具类   JsonDateValueProcessorUtil,代码如下。

      public class JsonDateValueProcessorUtil implements JsonValueProcessor {
    private String format ="yyyy-MM-dd HH:mm:ss";
 
    public JsonDateValueProcessorUtil() {
        super();
    }
 
    public JsonDateValueProcessorUtil(String format) {
        super();
        this.format = format;
    }
 
    @Override
    public Object processArrayValue(Object paramObject,
                                    JsonConfig paramJsonConfig) {
        return process(paramObject);
    }
 
    @Override
    public Object processObjectValue(String paramString, Object paramObject,
                                     JsonConfig paramJsonConfig) {
        return process(paramObject);
    }
 
 
    private Object process(Object value){
        if(value instanceof Date){
            SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA);
            return sdf.format(value);
        }
        return value == null ? "" : value.toString();
    }
}

4 下面一段代码  将集合中的时间转化为指定的格式

          dataMap = busAssignService.getBusAssignUnclaimedPage(userId, pageUtil);
   List<Map<String ,Object>> list=dataMap.getDatas();//得到list集合数据
   //处理时间
   JsonConfig jsonConfig = new JsonConfig();                                                         
   jsonConfig.registerJsonValueProcessor(Timestamp.class, new JsonDateValueProcessorUtil());              
   JSONArray array = JSONArray.fromObject(dataMap.getDatas(),jsonConfig);
    这样返回的集合中,有关时间的格式,就转化为我们指定的格式 yyyy-MM-dd HH:mm:ss

### 使用 `JSON.parseObject` 方法实现部分字段的对象化 在实际开发过程中,如果只需要将 JSON 字符串中的某些特定字段解析为对象,而忽略其他无关字段,则可以通过以下方式来完成: #### 1. 定义目标类并指定字段映射 通过定义一个只包含所需字段的目标类,并利用 FastJSON 提供的功能自动过滤掉不需要的字段。FastJSON 在反序列化会默认跳过未匹配到的字段。 ```java public class PartialObject { private String code; public String getCode() { return code; } public void setCode(String code) { this.code = code; } } ``` 此方法适用于已知哪些字段需要被保留的情况[^1]。 #### 2. 利用 Map 结构提取子集后再转换为目标对象 另一种更灵活的方式是先将整个 JSON 转换为通用的数据结构(如 `Map<String, Object>`),从中选取所需的键值对构建新的子集,最后再将其转化为自定义对象实例。 ```java import com.alibaba.fastjson.JSON; // 原始 JSON 数据 String jsonString = "{\"code\":\"success\",\"message\":\"Operation completed.\",\"data\":{\"key1\":\"value1\",\"key2\":123}}"; // 将 JSON 解析成 Map 形式 Map<String, Object> resultMap = JSON.parseObject(jsonString, Map.class); // 创建一个新的 HashMap 来存储感兴趣的字段 Map<String, Object> partialResult = new HashMap<>(); partialResult.put("code", resultMap.get("code")); // 如果还有嵌套数据需求也可以继续深入处理 data 部分 if (resultMap.containsKey("data")) { @SuppressWarnings("unchecked") Map<String, Object> dataMap = (Map<String, Object>) resultMap.get("data"); partialResult.put("nestedKey", dataMap.get("key1")); } // 把筛选后的 map 转换成实体类或者保持原样作为最终结果 PartialObject pojoFromFilteredData = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(partialResult)), PartialObject.class); System.out.println(pojoFromFilteredData.getCode()); // 输出 success 或者对应设置的内容 ``` 这种方法特别适合于那些无法提前预知所有可能输入的情况下动态调整所关心的信息集合。 #### 3. 自定义反序列化逻辑解决复杂场景下的问题 对于更加复杂的业务需求比如父子继承关系中只有子类能够正常工作等问题可以考虑重写 TypeReference 类型参数传递给 parseObject 函数调用来绕开限制;或者是借助注解机制明确指出不同名称之间应该如何相互映射从而避免冲突发生。 例如针对 `_id` 和 `id` 同存在的状况可通过如下配置达到预期效果: ```java import com.alibaba.fastjson.annotation.JSONField; public class CustomEntity { @JSONField(name="_id", alternateNames={"id"}) private String id; public String getId(){ return this.id; } public void setId(String id){ this.id=id; } } ``` 上述代码片段展示了如何运用 `@JSONField` 注解让同一个成员变量既能接受原始名又能兼容备选别称的形式来进行赋值操作[^3]。 --- ### 注意事项 尽管以上介绍了多种途径去达成仅加载必要信息的目的,但在选用具体方案前仍需综合考量项目背景以及性能指标等因素做出最佳抉择。另外值得注意的是随着版本迭代官方文档里提到未来可能会废弃掉一些现有特性因此建议密切关注最新变更日志以便及更新维护相关依赖库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值