【问题标题】:Serialization for Java CalendarJava 日历的序列化
【发布时间】:2015-11-23 16:41:24
【问题描述】:

如何通过扩展 json serializer<Calendar> 为 java Calendar 创建自定义序列化到 json?

我对@9​​87654322@ 进行了同样的尝试,它正在工作。在序列化方法中,我将Date转换为String,写成json格式。

为 java.util.Date 完成的示例代码类似于下面给出的代码

  public class CDJsonDateSerializer extends JsonSerializer<Date>{
  @Override
  public void serialize(Date date, JsonGenerator jsonGenerator,SerializerProvider provider)
 throws IOException {

      SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
      String dateString = dateFormat.format(date);
     jsonGenerator.writeString(dateString);
 }
}

它是这样使用的:

 @JsonSerialize(using = CDJsonDateSerializer.class)
 private Date startDate;

如何将 java 中的日历序列化为 json 而不会丢失日历对象中的数据?

【问题讨论】:

  • 你能发布你的代码吗?如果我们有一些东西可以开始回答会更容易。
  • 我已经用更多信息更新了这个问题。
  • 如果你将它用于日历会发生什么?
  • 如果我遵循上述方法。我将如何从写为 json 的字符串中反序列化回实际的日历对象。?对于日期到字符串,反之亦然。我们有“格式化和解析”方法
  • 您可以将其解析为日期,然后使用它初始化Calendar,如下所示c = Calendar.getInstance(); c.setTime(date);。有JsonDeserializer 类。

标签: java json jakarta-ee fasterxml


【解决方案1】:

从 JSON 到 Calendar

创建JsonSerializer

public class CalendarSerializer extends JsonSerializer<Calendar> {

    private SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    @Override
    public void serialize(Calendar calendar, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {

        String dateAsString = formatter.format(calendar.getTime());
        jsonGenerator.writeString(dateAsString);

    }
}

然后使用它:

@JsonSerialize(using = CalendarSerializer.class)
private Calendar calendar;

Calendar 到 JSON

创建一个JsonDeserializer

public class CalendarDeserializer extends JsonDeserializer<Calendar> {

    private SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    @Override
    public Calendar deserialize(JsonParser jsonParser,
                                DeserializationContext deserializationContext) 
                                throws IOException {

        String dateAsString = jsonParser.getText();

        try {
            Date date = formatter.parse(dateAsString);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar;
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

然后使用它:

@JsonDeserialize(using = CalendarDeserializer.class)
private Calendar calendar;

【讨论】:

  • 您可以为 Calendar 对象设置时区,但使用 getTime() 方法从中获取 Date 对象将返回带有主机时区的 Date 对象。如何处理?谢谢
  • 用这种方法处理时区有什么问题吗?
  • @AdarshGangaprakashUnnithan 如果需要,您可以将时区添加到您的日期格式中。您可以使用ISO 8601 格式。
  • 如果你坚持使用 ISO 8601 格式,你可以使用 javax.xml.bind.DatatypeConverter 进行转换。
【解决方案2】:

如果您需要的唯一数据作为 json 是日期,则可以使用 Gson:

JsonObject albums = new JsonObject();

albums.addProperty("date", new Date());

如果你的 json 有更多,你可以考虑定义你自己的类并通过将这个方法添加到定义的类来序列化它:

public String toJson() {
        Gson gson = new Gson();

        return gson.toJson(this);
    }

【讨论】:

  • 我可以使用fastxml通过将java Date转换为字符串并将其写为json来做同样的事情。我不知道如何为 java Calendar 对象实现相同的目标
  • @AdarshGangaprakashUnnithan,告诉我输出应该是什么样子的?
  • 我已经用更多信息更新了这个问题。在输出中我应该能够将存储的 json 对象反序列化回 java Calendar
  • @AdarshGangaprakashUnnithan 你快到了,但是作为评论添加到你的问题中,带有日历对象的 json 必须是什么样子? {"???":"????", "???":"????", "???":"????"}
  • 现在我在尝试序列化时遇到“无法识别的字段”错误。所以我没有 java 日历字段的确切 json 结构
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多