Java 使用Jackson将JSON解析为具有LocalDateTime的POJO;意外标记(开始对象),预期值字符串:预期数组或字符串;

Java 使用Jackson将JSON解析为具有LocalDateTime的POJO;意外标记(开始对象),预期值字符串:预期数组或字符串;,java,json,spring,parsing,Java,Json,Spring,Parsing,我在这里读了很多关于Java对象JSON解析的帖子,在引入LocalDateTime之前,我的解析工作得很好。我尝试使用Java8解析器、JSR310模块并构建一个定制—下面描述每个模块上的障碍。任何帮助都将不胜感激 这是我的JSON字符串,由Jackson从另一个POJO创建: {"validEscortsWTheirSpecReqs":"MAYBE", "modifiedDateTimeNeedToBeThere": {"dayOfMonth":6,"dayOfWeek"

我在这里读了很多关于Java对象JSON解析的帖子,在引入LocalDateTime之前,我的解析工作得很好。我尝试使用Java8解析器、JSR310模块并构建一个定制—下面描述每个模块上的障碍。任何帮助都将不胜感激

这是我的JSON字符串,由Jackson从另一个POJO创建:

{"validEscortsWTheirSpecReqs":"MAYBE",
 "modifiedDateTimeNeedToBeThere":     
    {"dayOfMonth":6,"dayOfWeek":"MONDAY","month":"FEBRUARY","year":2017,
     "hour":10,"minute":1,"second":24,"nano":0,"dayOfYear":37,"monthValue":2,
     "chronology":{"id":"ISO","calendarType":"iso8601"}
    }
}
产生

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string. at 
...
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:1376)
    at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:118)
    at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:39)
...
致电:

ComputeArrive response=mapper.readValue(responseString,ComputeArrive.class)

响应包含以下字段:

Logger//不应该由JSON映射,没有getter/setter 静态最终长SerialVersionId=1L;//" 字符串validescortswhitherspecreqs=“YES”//want-mapped LocalDateTime ModifiedDateTimeNeedToBether//要映射吗

到目前为止,我可能注册了太多的模块,将它们添加进来以尝试对其进行解析:

    mapper.findAndRegisterModules();
    //mapper           .registerModule(new ParameterNamesModule());
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());
    mapper.registerModule(new JSR310Module());
因此,我尝试将Spring引导依赖项添加到我的项目中,并为JSR310编写一个定制程序(考虑到上面的模块,这似乎是不必要的):

我的应用程序有许多依赖项,因此我不想将任何内容设为它的“父级”,并添加了以下依赖项。但是,找不到类“Jackson2ObjectMapperBuilder”,因此上面的内容不使用这些依赖项编译:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>   

org.springframework
弹簧芯
4.3.5.1发布
org.springframework
弹簧网
4.3.5.1发布
org.springframework
春豆
4.3.5.1发布
org.springframework
spring上下文
4.3.5.1发布
org.springframework
弹簧式
4.3.5.1发布
org.springframework
春季aop
4.3.5.1发布
奥帕林
奥帕林
1
我没有找到太多关于“Jackson2ObjectMapperBuilderCustomizer”的文档,它可能是“Jackson2ObjectMapperBuilder”的替代品,这可能是问题所在。请注意,我没有实例化上面的类,因为我假设Spring实例化了它


如果您能想到如何解析我的响应,我将不胜感激。

对于我来说,通过将
JavaTimeModule
添加到
Jackson2ObjectMapperBuilder
解决了这个问题,如下所示:

@Configuration
public class MyConfiguration {

    @Bean
    @Primary
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        return builder.modulesToInstall(new JavaTimeModule());
    }

}

然后Spring将此映射器用于已注册的模块。

我认为问题在于对LocalDate的解析,请尝试以下操作:

{
    "validEscortsWTheirSpecReqs":"MAYBE",
    "modifiedDateTimeNeedToBeThere":[6,2,2017]
}

用整数表示的日、月、年。

正如@Tobias所说,使用
JavaTimeModule将解决这个问题

在pom xml中添加JSR310依赖项,使Jackson能够识别Java 8日期和时间API数据类型:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

您应该使用此配置来序列化和反序列化LocalDate或其他Java 8日期和时间API数据类型。

我也遇到了这个问题(除了手动配置,而不是通过Spring)。您是否解决了此问题?->“ModifiedDateTimeNeedToBether”:{“dayOfMonth”:6,“dayOfWeek”:“周一”、“月份”:“二月”,“年”:2017,“小时”:10,“分钟”:1,“秒”:24,“纳米”:0,“年中之日”:37,“月值”:2,“年表”:{“id”:“ISO”,“日历类型”:“iso8601”}”将很难由Jackson反序列化。您似乎走对了方向。您是否尝试过反序列化更合适的内容,例如iso日期。我遇到了类似的问题,这篇文章帮助了我:
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
        return objectMapper;
    }
}