首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用json将Java8 LocalDateTime序列化为日历对象

如何使用json将Java8 LocalDateTime序列化为日历对象
EN

Stack Overflow用户
提问于 2022-06-29 15:33:09
回答 1查看 112关注 0票数 0

我正在使用jackson-datatype-jsr310 310模块,它支持LocalDateTime序列化。但默认情况下,它将日期/时间序列化为"2022,6,29,17,15,54“。

但是,我需要重写这个行为,以便以"Calendar“格式(例如)序列化/反序列化它。作为json对象

代码语言:javascript
复制
"arrivalDate": {
  "month": "JUNE",
  "dayOfWeek": "WEDNESDAY",
  "dayOfYear": 180,
  "nano": 0,
  "year": 2022,
  "monthValue": 6,
  "dayOfMonth": 29,
  "hour": 12,
  "minute": 53,
  "second": 46,
  "chronology": {
    "id": "ISO",
    "calendarType": "iso8601"
  }
}

对于所有应用程序,该设置不应该是全局的,而仅用于内部特定的ObjectMapper实例化。

EN

回答 1

Stack Overflow用户

发布于 2022-07-01 05:50:03

引言

让我们把Jackson 2.13.3作为当前版本。

分析

这样的特征似乎已被排除在外。

请参阅下面的源代码,并注意下面的注释:jackson-databind/BeanSerializerFactory.java at jackson-databind-2.13.3·FasterXML/jackson-databind

代码语言:javascript
复制
    protected JsonSerializer<?> _findUnsupportedTypeSerializer(SerializerProvider ctxt,
            JavaType type, BeanDescription beanDesc)
        throws JsonMappingException
    {
        // 05-May-2020, tatu: Should we check for possible Shape override to "POJO"?
        //   (to let users force 'serialize-as-POJO'?
        final String errorMsg = BeanUtil.checkUnsupportedType(type);

也许,打开适当的GitHub问题是值得的。

可能的解决办法

引入并使用自定义BeanSerializerFactory实现,该实现不会阻止对JSR 310类型( java.time包)和Joda类型( org.joda.time包)使用默认的Jackson序列化程序。

为了理解这个想法,请参考以下方法的实施:

  • com.fasterxml.jackson.databind.ser.BeanSerializerFactory._findUnsupportedTypeSerializer()
  • com.fasterxml.jackson.databind.util.BeanUtil.checkUnsupportedType()
  • com.fasterxml.jackson.databind.util.BeanUtil.isJava8TimeClass()

CustomBeanSerializerFactory

代码语言:javascript
复制
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.cfg.SerializerFactoryConfig;
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;

public final class CustomBeanSerializerFactory extends BeanSerializerFactory {
    protected CustomBeanSerializerFactory(final SerializerFactoryConfig config) {
        super(config);
    }

    @Override
    protected JsonSerializer<?> _findUnsupportedTypeSerializer(
        final SerializerProvider ctxt,
        final JavaType type,
        final BeanDescription beanDesc
    ) {
        return null;
    }
}

Schedule

代码语言:javascript
复制
import java.time.LocalDateTime;

public final class Schedule {
    private final LocalDateTime arrivalDate;

    public Schedule(final LocalDateTime arrivalDate) {
        this.arrivalDate = arrivalDate;
    }

    public LocalDateTime getArrivalDate() {
        return arrivalDate;
    }
}

Program

代码语言:javascript
复制
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.LocalDateTime;

public final class Program {
    public static void main(final String[] args) throws JsonProcessingException {
        final LocalDateTime localDateTime = LocalDateTime.of(
            2022, 1, 2, 3, 4, 5, 6
        );
        final Schedule schedule = new Schedule(localDateTime);

        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializerFactory(
            new CustomBeanSerializerFactory(null)
        );
        final String jsonString = objectMapper.writeValueAsString(schedule);
        System.out.println(jsonString);
    }
}

程序输出:

代码语言:javascript
复制
{"arrivalDate":{"nano":6,"year":2022,"monthValue":1,"dayOfMonth":2,"hour":3,"minute":4,"second":5,"month":"JANUARY","dayOfWeek":"SUNDAY","dayOfYear":2,"chronology":{"id":"ISO","calendarType":"iso8601"}}}

附加参考资料

代码语言:javascript
复制
- Comment: [Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type `java.time.Instant` not supported by default · Issue #26859 · spring-projects/spring-boot](https://github.com/spring-projects/spring-boot/issues/26859#issuecomment-869144674).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72804142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档