无法反序列化org.joda.time.DateTime或LOCALDATE的实例进行START_O

2019-08-03 06:30发布

2.1.1, 乔达模块。

余可使用objectMapper.readValue(文件,POJO的.class)一个JSON文件转换为POJO在单元测试;

然而,当一个Spring RESTTemplate客户端调用默认JSON转换器转换成含有约达类型(日期时间或LOCALDATE)的域对象的InputStream,它产生一个错误: objectMapper.readValue(httpInputMessage.getBody(), javaType)

   
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.joda.time.DateTime out of START_OBJECT token
at Source: org.mortbay.jetty.HttpParser$Input@46a09b; line: 1, column: 752
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:599)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:593)
at com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:51)
at com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer.deserialize(DateTimeDeserializer.java:21)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:559)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:393)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:289)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserialize(BuilderBasedDeserializer.java:143)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:226)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeSetAndReturn(MethodProperty.java:106)
at com.fasterxml.jackson.databind.deser.BuilderBasedDeserializer.deserializeFromObject(BuilderBasedDeserializer.java:

与发生LOCALDATE同样的问题

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: expected JSON Array, String or Number
at Source: org.mortbay.jetty.HttpParser$Input@d297c0; line: 1, column: 51
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:692)
at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:50)
....

为什么调用链传递START_OBJECT在另1例和START_ARRAY?

Answer 1:

为了解决类似的问题,我做了以下内容,

我下载杰克逊的数据类型-乔达-2.2.1.jar从http://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-joda/2.2.1如果你正在使用maven的依赖定义有太多。

然后我说,每场LOCALDATE注释在我的应用程序如下:

@JsonDeserialize(using=LocalDateDeserializer.class)
private LocalDate releasedDate;

进口是这样的:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer;

而问题消失了。

希望这可以帮助!



Answer 2:

我想,这与串行器和解串之间的一些差异做; 使得一个产生其它(我认为约达模块实际上写入整数数组,注册时)。 这很可能是因为无论是解串器或串行登记丢失。

默认情况下,没有任何多余的处理,杰克逊会考虑乔达类型只是的POJO,并使用getter / setter方法。 但乔达模块采用更紧凑的表示(字符串,数组)。 那么,什么可能发生的是,序列化侧不使用乔达模块; 和反序列化的。



Answer 3:

你应该使用序列化和反序列化的乔达时间; 对那些你想保存和获取领域。
通过这样做,我们会给两侧的责任杰克逊(Java来蒙戈/ JSON和蒙戈/ JSON到Java转换)。

示例代码:

@JsonDeserialize(using= LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
LocalDate dateFieldToBeConverted

而这些都是进口:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize

import com.fasterxml.jackson.databind.annotation.JsonSerialize

import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer

import com.fasterxml.jackson.datatype.joda.ser.LocalDateSerializer

import org.joda.time.LocalDate

这样做了以后,简单的保存和查询findOne对蒙戈(通过Java回购类)将没有任何问题的工作。 希望这可以帮助。



Answer 4:

这里的关键问题是,春天以不同的方式转换JodaTime然后例如新泽西州。

这就是我在我做app-servlet.xml

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean"/>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

在这里,你可以找到no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean从Java的JSON-客户端库



文章来源: Can not deserialize instance of org.joda.time.DateTime or LocalDate out of START_OBJECT token