如何通过GsonBuilder将日期JSON对象转为键值对格式?
解决Gson中BsCal类型字段转为字符串格式的问题
你当前遇到的问题是:使用GsonBuilder.setDateFormat("dd-MM-yyyy HH:mm:ss")后,shiftStTm字段仍以包含dateTime和timeInMs的对象形式输出,期望将其转为单一字符串格式。
问题根源
setDateFormat的作用范围:该配置仅对Java原生Date类型生效,而你的shiftStTm是自定义的BsCal类型,因此不会触发这个格式规则。- 自定义适配器冲突:你注册了
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
相关产品推荐
相关产品推荐

