You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过GsonBuilder将日期JSON对象转为键值对格式?

解决Gson中BsCal类型字段转为字符串格式的问题

你当前遇到的问题是:使用GsonBuilder.setDateFormat("dd-MM-yyyy HH:mm:ss")后,shiftStTm字段仍以包含dateTime和timeInMs的对象形式输出,期望将其转为单一字符串格式。

问题根源

  1. setDateFormat的作用范围:该配置仅对Java原生Date类型生效,而你的shiftStTm是自定义的BsCal类型,因此不会触发这个格式规则。
  2. 自定义适配器冲突:你注册了CalendarSerializer作为BsCal的类型适配器,当前这个适配器的逻辑是将BsCal序列化为对象;同时你额外定义了MyDataMsgSerializer,内部重复创建Gson实例并配置适配器,导致序列化逻辑冗余且可能冲突。

解决方案

1. 修改CalendarSerializer,让BsCal直接序列化为字符串

调整CalendarSerializer的serialize方法,返回指定格式的日期字符串而非JsonObject:

public class CalendarSerializer implements JsonSerializer<BsCal>, JsonDeserializer<BsCal> {
    // 定义目标日期格式
    private final SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

    @Override
    public JsonElement serialize(BsCal src, Type typeOfSrc, JsonSerializationContext context) {
        // 根据BsCal的实际API获取日期对象,例如src.getDateTime()或src.toDate()
        Date targetDate = src.getDateTime();
        // 格式化为字符串并返回JsonPrimitive
        return new JsonPrimitive(dateFormatter.format(targetDate));
    }

    @Override
    public BsCal deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // 实现反序列化逻辑:将字符串转为BsCal对象
        try {
            Date parsedDate = dateFormatter.parse(json.getAsString());
            BsCal bsCal = new BsCal();
            // 根据BsCal的构造方法或setter设置属性,例如bsCal.setDateTime(parsedDate)
            return bsCal;
        } catch (ParseException e) {
            throw new JsonParseException("Invalid date format for BsCal", e);
        }
    }
}

2. 移除冗余的MyDataMsgSerializer

Gson默认支持普通Java对象的序列化/反序列化,无需为MyDataMsg自定义适配器。简化后的转换方法:

private String convertObjToJson(MyDataMsg myDataMsg) {
    Gson gson = new GsonBuilder()
            .registerTypeHierarchyAdapter(BsCal.class, new CalendarSerializer())
            .serializeNulls()
            .create();
    String jsonToString = gson.toJson(myDataMsg);
    LOGGER.info("Converted Json Object {}", jsonToString);
    return jsonToString;
}

最终效果

调整后,shiftStTm字段会输出为你期望的格式:

"shiftStTm":"2022-11-30 00:00:00"

内容的提问来源于stack exchange,提问作者venky598

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:15:51