1.修改Jackson序列化JAVA8时间的问题

        val objectMapper: ObjectMapper = ObjectMapper()
        val javaTimeModule = JavaTimeModule()
        javaTimeModule.addSerializer(LocalDate::class.java, LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
        javaTimeModule.addSerializer(LocalTime::class.java, LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
        javaTimeModule.addSerializer(LocalDateTime::class.java, LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
        javaTimeModule.addDeserializer(LocalDate::class.java, LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
        javaTimeModule.addDeserializer(LocalTime::class.java, LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")))
        javaTimeModule.addDeserializer(LocalDateTime::class.java, LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
        objectMapper.registerModule(javaTimeModule)

2.objectMapper.readValue(json)出现错误

		//引入jackson-module-kotlin
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
            <version>2.11.0</version>
        </dependency>
//配置ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
objectMapper.registerModule(KotlinModule())
//此刻在使用readValue方法便不会报错,由于类型推断,所以不用像JAVA一样定义TypeReference来做转换
objectMapper.readValue(json)
//java此刻写法
objectMapper.readValue(json, new TypeReference<List<LocalTime>>(){})

3.JacksonXml遇到问题

@JacksonXmlRootElement(localName = "Attack_Pattern_Catalog")
data class AttackPatterns(

   /**
 	* 反序列化时会出现Jackson Could not find creator property with name “Attack_Pattern”,
 	* 这个问题是Jackson-module-kotlin的Bug导致的,官方已列为BUG,但是还未修复,问题连接
 	* 参见https://github.com/FasterXML/jackson-module-kotlin/issues/153
 	*/
    @JacksonXmlElementWrapper(localName = "Attack_Patterns", useWrapping = false)
    @JacksonXmlProperty(localName = "Attack_Pattern")
    var attackPatterns: List<AttackPattern> = listOf()
 

在官方解决BUG前的解决方案如下

	//目前将上面的数据类写法改成这样,便可以解决问题
	@JacksonXmlRootElement(localName = "Attack_Pattern_Catalog"
	data class AttackPatterns(
		private var _attackPatterns: List<AttackPattern> = listOf(
	) {
    @get:JacksonXmlElementWrapper(localName = "Attack_Patterns", useWrapping = false)
    @get:JacksonXmlProperty(localName = "Attack_Pattern")
    var attackPatterns
        set(value) { _attackPatterns= value }
        get() = _attackPatterns
}

4.Jackson XML反序列化遇到Expected END_ELEMENT, got event of type 1

		
		/**
 		* 使用spring boot2.4.7的时候,反序列化XML出现了Expected END_ELEMENT, got event of type 1
		* 的错误,查阅了很多资料都找不到解决方法,最后在Github的jackson-module-kotlin的ISSUES中
		* 看到有人评论说换到2.12.1就可以,https://github.com/FasterXML/jackson-module-kotlin/issues/203
 		*/
        <dependency>
            <artifactId>jackson-databind</artifactId>
            <groupId>com.fasterxml.jackson.core</groupId>
            <version>2.12.1</version>
        </dependency>
        //全局替换Jackson版本
        <jackson-bom.version>2.12.3</jackson-bom.version>

       ``



Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐