gpt4 book ai didi

java - 使用 Jackson "Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string."使用 LocalDateTime 将 JSON 解析为 POJO

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:40 29 4
gpt4 key购买 nike

我在这里阅读了很多关于将 JSON 解析为 Java 对象的帖子,在我引入 LocalDateTime 之前,我的解析工作正常。我曾尝试使用 Java 8 解析器、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 映射,没有 getters/settersstatic final long serialVersionUID = 1L;//"String validEscortsWTheirSpecReqs = "YES"//想要映射LocalDateTime modifiedDateTimeNeedToBeThere//想要映射

我现在可能已经注册了太多模块,添加它们以尝试让它解析:

    mapper.findAndRegisterModules();
//mapper .registerModule(new ParameterNamesModule());
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(new JSR310Module());

所以我尝试将 Spring Boot 依赖项添加到我的项目中并为 JSR310 编写定制程序(考虑到上述模块,这似乎是不必要的):

@Configuration
public class JacksonConfig {

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

我的应用程序有很多依赖项,所以我不想让任何东西成为它的“父”,并添加了以下依赖项。但是,未找到“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>

我没有找到很多关于“Jackson2ObjectMapperBuilderCustomizer”的文档,它可能是“Jackson2ObjectMapperBuilder”的替代品——这可能是问题所在。请注意,上面的类不是我实例化的,因为我假设 Spring 实例化了它。

如有任何关于如何解析我的回复的想法,我们将不胜感激!

最佳答案

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

@Configuration
public class MyConfiguration {

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

}

然后 Spring 将此映射器与已注册的模块一起使用。

关于java - 使用 Jackson "Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string."使用 LocalDateTime 将 JSON 解析为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41617715/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com