Java 使用LocalDateTime字段反序列化JSON到对象
我放弃了。我已经看了所有可能的SO页面,但我无法让它工作 我有一个类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
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定制反序列化程序。