JSONObject序列化时间异常

JSONObject序列化时间异常

  • 场景:Redis数据缓存
  • 数据格式:Map集合
{
  "min": {
    "windPowerSupply": 381.2,
    "storagePowerSupply": 20,
    "wge2": 385.8,
    "opticalPowerSupply": 0,
    "peakShavingCapacity": 2104.1,
    "thermalPowerSupply": 2564.1,
    "powerSupplyCapacity": 3778.1,
    "loadForecast": 3182.2,
    "powerSupplyMargin": 595.9,
    "allocationReserve": 148,
    "hydraulicPowerSupply": 575,
    "forecastDate": "2023-02-09 10:10:10",
    "peakRegulationMargin": 1078.1
  },
  "max": {
   ...
  },
  "details": [
    ...
  ]
}
  • 问题:JSONObject转换后(时间字段变成了毫秒数)
{
  "min": {
    "windPowerSupply": 381.2,
    "storagePowerSupply": 20,
    "wge2": 385.8,
    "opticalPowerSupply": 0,
    "peakShavingCapacity": 2104.1,
    "thermalPowerSupply": 2564.1,
    "powerSupplyCapacity": 3778.1,
    "loadForecast": 3182.2,
    "powerSupplyMargin": 595.9,
    "allocationReserve": 148,
    "hydraulicPowerSupply": 575,
    "forecastDate": 1675850400000,
    "peakRegulationMargin": 1078.1
  },
  "max": {
    ...
  },
  "details": [
    ...
  ]
}
  • 问题分析

    • Redis格式化的原因(确实存在,但这里不是Redis的问题)

      Redis会格式化会将时间字段转换成毫秒数进行存储,转出时,接收对象可被序列化成功,不会影响数据结构

    • 序列化导致的,时间字段存放在Map集合中,JSONObject直接将时间字段转换成了毫秒数(主要)

      • 转入时,Date类型数据会被转换成毫秒数

      • 转出时,元数据不会被转换成Date类型数据

  • 解决方案

    • 用单独的类对时间字段进行封装,并将类进行序列化,json转换前后不会受到影响

序列化类:BalanceForecastDataVo.class

@Data
public class BalanceForecastDataVo implements Serializable {
    private List<PmBalancedForecastDetailVo> chart;
    private List<PmBalancedForecastDetailVo> details;
    private PmBalancedForecastDetailVo max;
    private PmBalancedForecastDetailVo min;
}

定时任务:TimingTask.class

@Component
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TimingTask {
    private final IPmBalancedForecastService iPmBalancedForecastService;
    private final StringRedisTemplate stringRedisTemplate;
	private void makeCachePhyc() {
        BalanceForecastDataVo totalNew = iPmBalancedForecastService.getTotalNew();
        stringRedisTemplate.opsForValue()
            .set(PowerGenerationGroup.PHYC_ZL, JSONObject.toJSONString(totalNew), 60, TimeUnit.SECONDS);
    }
}

目标方法:getTotalNew

public BalanceForecastDataVo getTotalNew() { 
	BalanceForecastDataVo balanceForecastDataVo = new BalanceForecastDataVo();
    String redisData = stringRedisTemplate.opsForValue().get(PowerGenerationGroup.PHYC_ZL);
    if(NullCheckUtils.isNotNull(redisData)) {
        balanceForecastDataVo = JSONArray.parseObject(redisData, BalanceForecastDataVo.class);
        return balanceForecastDataVo;
    }
}
  • 其他序列化方式,尝试过,但是未找到靠谱方案
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值