Java 使用LocalDateTime字段反序列化JSON到对象

Java 使用LocalDateTime字段反序列化JSON到对象,java,json,jackson,Java,Json,Jackson,我放弃了。我已经看了所有可能的SO页面,但我无法让它工作 我有一个类ConfigKeyVal,如下所示: @Data @Builder @NoArgsConstructor @AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class ConfigKeyValue { private String name; private NssConfigDto value; } @Data @B

我放弃了。我已经看了所有可能的SO页面,但我无法让它工作

我有一个类
ConfigKeyVal
,如下所示:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ConfigKeyValue {

    private String name;
    private NssConfigDto value;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Config {

    private String name;
    private String source;
    private String destination;
    private int cycle;
    private LocalDateTime fixedTime;
    private LocalDateTime submitDate;
}
其中
Config
类如下所示:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ConfigKeyValue {

    private String name;
    private NssConfigDto value;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Config {

    private String name;
    private String source;
    private String destination;
    private int cycle;
    private LocalDateTime fixedTime;
    private LocalDateTime submitDate;
}
我试图将
ConfigKeyVal
(前一个)对象的JSON数组直接反序列化到我的ArrayList中

public class ConfigKeyValueList extends ArrayList<ConfigKeyValue> {
    public ConfigKeyValueList() {
        super();
    }
}
我尝试过使用
mapper.registerModule(新的JavaTimeModule())但这没有帮助。我是否必须为此编写自己的反序列化程序,或者是否有一个有效的工具,而我却完全错了

我得到的错误是:
com.fasterxml.jackson.databind.JsonMappingException:无法构造java.time.LocalDateTime的实例:找不到合适的构造函数,无法从对象值反序列化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息)

我正在gradle文件中使用这些jackson依赖项:

compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: '2.9.6'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jdk8', version: '2.9.6'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.6'
编辑:这就是JSON的样子

[
    {
        "name": "kek1",
        "value": {
            "name": "kek1",
            "source": "source",
            "destination": "dest",
            "cycle": 1,
            "fixedTime": {
                "year": 2017,
                "month": "APRIL",
                "dayOfYear": 95,
                "dayOfWeek": "WEDNESDAY",
                "dayOfMonth": 5,
                "monthValue": 4,
                "hour": 4,
                "minute": 20,
                "second": 0,
                "nano": 0,
                "chronology": {
                    "id": "ISO",
                    "calendarType": "iso8601"
                }
            },
            "submitDate": {
                "year": 2017,
                "month": "APRIL",
                "dayOfYear": 95,
                "dayOfWeek": "WEDNESDAY",
                "dayOfMonth": 5,
                "monthValue": 4,
                "hour": 4,
                "minute": 20,
                "second": 0,
                "nano": 0,
                "chronology": {
                    "id": "ISO",
                    "calendarType": "iso8601"
                }
            }
        }
    },
    {
        "name": "kek2",
        "value": {
            "name": "kek2",
            "source": "source",
            "destination": "dest",
            "cycle": 1,
            "fixedTime": {
                "year": 2017,
                "month": "APRIL",
                "dayOfYear": 93,
                "dayOfWeek": "MONDAY",
                "dayOfMonth": 3,
                "monthValue": 4,
                "hour": 5,
                "minute": 10,
                "second": 0,
                "nano": 0,
                "chronology": {
                    "id": "ISO",
                    "calendarType": "iso8601"
                }
            },
            "submitDate": {
                "year": 2017,
                "month": "APRIL",
                "dayOfYear": 93,
                "dayOfWeek": "MONDAY",
                "dayOfMonth": 3,
                "monthValue": 4,
                "hour": 5,
                "minute": 10,
                "second": 0,
                "nano": 0,
                "chronology": {
                    "id": "ISO",
                    "calendarType": "iso8601"
                }
            }
        }
    }
]

Jackson无法从任何JSON字符串值反序列化LocalDateTime对象


将LocalDateTime对象更改为“字符串”。

Jackson无法从任何JSON字符串值反序列化LocalDateTime对象


将LocalDateTime对象更改为“String”。

首先,我不建议像那样序列化日期。我强烈鼓励您遵守标准和使用,这是由和认可的:


如果您可以控制JSON序列化 如果使用,则可以使用来处理来自和为您进行的转换:

@配置
公共类MongoConfiguration{
@豆子
公共MongoCustomConversions customConversions(){

列表首先,我不建议像那样连续化日期。我强烈建议您坚持标准和使用,这是由和认可的:


如果您可以控制JSON序列化 如果使用,则可以使用来处理来自和为您进行的转换:

@配置
公共类MongoConfiguration{
@豆子
公共MongoCustomConversions customConversions(){

列表您必须将模块添加到ObjectMapper

private ObjectMapper getMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.INDENT_OUTPUT,false);
    mapper.setSerializationInclusion(Include.NON_NULL);
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return mapper;
}
由于模块的最新版本是JavaTimeModule,所以它以前是JSR310模块

编辑: 它应该同时用于序列化/反序列化,您需要的可能是mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)

JSON格式应为ISO:

{
    "name": "kek2",
    "value": {
        "name": "kek2",
        "source": "source",
        "destination": "dest",
        "cycle": 1,
        "fixedTime": "2018-07-17T15:10:55"
...

您必须将模块添加到ObjectMapper

private ObjectMapper getMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.INDENT_OUTPUT,false);
    mapper.setSerializationInclusion(Include.NON_NULL);
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return mapper;
}
由于模块的最新版本是JavaTimeModule,所以它以前是JSR310模块

编辑: 它应该同时用于序列化/反序列化,您需要的可能是mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)

JSON格式应为ISO:

{
    "name": "kek2",
    "value": {
        "name": "kek2",
        "source": "source",
        "destination": "dest",
        "cycle": 1,
        "fixedTime": "2018-07-17T15:10:55"
...

为什么日期是这样序列化的?你能改变它吗?@CassioMazzochiMolin我用了
LocalDateTime.of()的
在将这些对象上传到MongoDB之前在构造函数中。稍后我尝试检索它们,这就是我得到的。这不正常吗?我会将日期作为字符串存储在MongoDB中。是否使用Spring数据?Morphia?只是MongoDB Java驱动程序?@CassioMazzochiMolin是的,我使用Spring。我的意思是我有一个单独的服务负责存储对象(其数据库位于Mongo中)我正在向这个服务发送一个对象数组。我正在发送的对象可以有任何字段。基本上,我可以灵活地为日期使用任何格式,但我必须能够比较它们,这就是我使用
LocalDateTime
的原因。为什么日期会这样序列化?你能更改它吗?@casiomazzochimolin我使用了
LocalDateTime。of()
在将这些对象上传到MongoDB之前在构造函数中。稍后我尝试检索它们,这就是我得到的。这不正常吗?我会将日期作为字符串存储在MongoDB中。是否使用Spring数据?Morphia?只是MongoDB Java驱动程序?@CassioMazzochiMolin是的,我使用Spring。我的意思是我有一个单独的服务负责存储对象(其数据库位于Mongo中)我正在向这个服务发送一个对象数组。我正在发送的对象可以有任何字段。基本上,我可以灵活地为日期使用任何格式,但我必须能够比较它们,这就是我使用
LocalDateTime
的原因。我对此不太确定:我不太确定:我没有直接访问Mongo d的权限database。我可以通过服务从中存储和获取项目。如果我使用简单的REST HTTP get从中获取数据,我发布的JSON就是我得到的。我必须只能处理JSON本身。@Lisek那么你需要为Jackson定制反序列化器。我没有直接访问Mongo数据库的权限。我可以通过服务从中存储和获取项目。JSON Iposted是使用简单的REST HTTP get从中获取数据时得到的。我必须只能处理JSON本身。@Lisek那么您需要为Jackson定制反序列化程序。