Tag: 杰克逊

在Spring Boot 2.0.0.M1中将Jackson配置为“全局”使用SNAKE_CASE

我使用Spring Boot 2.0.0.M1 (因此Spring 5.0.0.RC1 )。 我试图将其配置为使用PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE但到目前为止我不工作。 我试过了: 具有以下内容的application.yml文件: spring: jackson: property-naming-strategy: SNAKE_CASE 配置Jackson2ObjectMapperBuilder bean: @Bean @Primary open fun jacksonBuilder(): Jackson2ObjectMapperBuilder { val jacksonMapperBuilder = Jackson2ObjectMapperBuilder() .failOnUnknownProperties(false) .modules(JavaTimeModule(), KotlinModule()) .propertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE) logger.info { "Jackson2ObjectMapperBuilder configured successfully…" } return jacksonMapperBuilder } 配置一个ObjectMapper bean: @Bean @Primary open fun objectMapper(): ObjectMapper { val objectMapper = ObjectMapper() objectMapper.registerModule(JavaTimeModule()) objectMapper.registerModule(KotlinModule()) objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE) […]

在通用属性解串器中包装所有标准和自定义Jackson解串器

我正在使用杰克逊2.8并期待包装所有标准/自定义反序列化器在一个标准的包装反序列化,以便对每个属性的每个反序列化的值实例做一些后处理。 为了做到这一点,我分类了BeanDeserializerModifier ,以便将基础JsonDeserializer和给定属性类型的相应JavaType传递给JsonDeserializer的子类, StdJsonDeserializer然后调用该基本反序列化器并对结果值实例执行各种操作。 在反序列化过程中,我得到以下错误: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.lindisfarne.MundaneDataClass: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) 如果没有BeanDeserializerModifier ,那么这个操作当然会工作得很好 – 这显然我得到了一个不正确或不完整的反序列化器。 我怎样才能得到正确的解串器给定的类型? 完整的Kotlin代码重现以下问题: package com.lindisfarne import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.* import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.fasterxml.jackson.module.kotlin.KotlinModule import com.fasterxml.jackson.module.kotlin.readValue class […]

杰克逊定制串行器委托给杰克逊序列化

我有一个自定义的序列化程序,我将其中的值更改为不同的类型。 我不知道这是什么类型,所以想委托杰克逊弄清楚如何序列化(因为杰克逊已经具备了所有这些功能)。 有什么办法可以在MySerializer中做到这一点? 换句话说,我不想在结果值的类型上做一个大的switch语句来决定使用哪种JsonGenerator方法。 (代码在Kotlin,顺便说一句) class MySerializer() : JsonSerializer<Any?>() { override fun serialize(value: Any?, gen: JsonGenerator?, serializers: SerializerProvider?) { // Here I transform the value to another type and want to delegate to Jackson to determine how it should be serialized val myNewVal = someFunction(value) // something like super.serialize(myNewVal)??? } }

Kotlin的enum类的value属性中的@JsonValue注释

我无法在枚举类的值参数上应用Jackson的@JsonValue注释: enum class CancellationReason(@JsonValue val code: String) { CUSTOMER_RESIGNED("20"), ERRORS_IN_FOO("21"), ERRORS_IN_BAR("24"); } 错误消息指出: This annotation in not applicable to target 'value parameter' 。 有什么问题?

自定义KeyDeserializer

我有一个用例,我需要一个自定义的KeyDeserializer 。 下面的工作,但感觉错了(这是Kotlin,但应该是Java民间非常可读): class KeepMapKeyDeserializer : KeyDeserializer() { // In reality this is a single executable-wide instance val mapper = ObjectMapper() override fun deserializeKey(key: String, ctxt: DeserializationContext): ColumnId<*> { return mapper.readValue(key, ColumnId::class.java) } } 直接在deserializeKey方法中使用ObjectMapper感觉很奇怪,但我找不到任何方法来使用传递给该方法的DeserializationContext 。 例如,使用ctxt.parser.readValueAs(ColumnId::class.java)不起作用,也不能做更详细的选项,如: val colIdType = ctxt.typeFactory.constructType(ColumnId::class.java) val deserializer = ctxt.findRootValueDeserializer(colIdType) return deserializer.deserialize(ctxt.parser, ctxt) as ColumnId<*> 这真的是正确的方式去做事吗? 请注意,序列化的ColumnId如下所示: {"name":"c1","clazz":"kotlin.String"}

如何将JSON反序列化为与Kotlin + Jackson的List <SomeType>

什么是反序列化以下JSON的正确语法: [ { "id" : "1", "name" : "Blues" }, { "id" : "0", "name" : "Rock" } ] 我试过了: //Works OK val dtos = mapper.readValue(json, List::class.java) 不过我想要: val dtos : List<GenreDTO> = mapper.readValue(json, List<GenreDTO>::class.java) 上面的语法是不正确的,并给出: only classes are allowed on the left hand side of a class literal

杰克逊反序列化 – Kotlin数据类 – 每个映射器缺少字段的默认值

鉴于这个数据类: data class MyPojo(val notInJson: Int, val inJson: Int) 假设我想实现一个形式的函数: fun deserialize(jsonString: String, valueForFieldNotInJson: Int): MyPojo jsonString不包含名为notInJson的字段。 还假设我无法控制MyPojo类的定义。 我怎么能使用杰克逊库反序列化MyPojo从jsonString和增加缺少的字段( notInJson )从valueForFieldNotInJson参数? 笔记: 基本上,问题是关于反序列化一个不可变的类,其中一些字段来自Json,另外一些是在运行时提供的。 使用自定义反序列化器或构建器将不起作用,因为在编译时缺少值是未知的。

将ByteArrayOutputStream转换为Kotlin中的json

我试图创建一个2服务的资源,1在application / x-www-form-urlencoded和字符串有效载荷和其他应用程序/ json格式与json正文。 我有这个代码: @POST @Path("/test") fun test(@Context request: ContainerRequest): Response { val baos = ByteArrayOutputStream() request.entityStream.use { it.copyTo(baos) } val ipnRawData = baos.toString() var map : Map<String,Any> map = when (request.headers.getFirst("Content-Type")) { "application/json" -> objectMapper.convertValue(ipnRawData,Map::class.java) as Map<String,Any> "application/x-www-form-urlencoded" -> LinkedHashMap() else -> throw UnsupportedOperationException() } //….handle the map return Response.status(200).build() } 但是,当我尝试运行它与json选项,和身体: {"name" […]

Kotlin + Spring Boot请求编组

鉴于以下有效载荷: data public class CandidateDetailDTO(val id: String, val stageName: String, val artists: Iterable<ArtistDTO>, val instruments: Iterable<InstrumentDTO>, val genres: Iterable<GenreDTO>, val discoverable: Boolean, val gender: Gender, val involvement: Involvement, val biography: String, var photoURLs: List<URL>, var birthday: Date? = null, var customGenre: String? = null) 。 。 如图所示某些字段允许为空,其他字段则不允许。 当使用Spring Boot调用请求时,如果缺少预期字段,则返回400 – 错误请求。 这不是预料之中,我期望有关的管制员建议适用于: @ControllerAdvice public class […]

你如何让杰克逊使用Kotlin默认参数缺失值?

我有一个看起来像这样的Kotlin数据类, data class SomeData( private val notInJson: String = "some default value", private val inJson: String ) 和一个JSON字符串,我想反序列化成这个类的一个实例 – { "inJson" : "value" } 当我试图反序列化这个数据时,我得到一个错误,参数notInJson不能为null。 看起来像杰克逊传递一个空值,因为它是在JSON字符串中缺少。 有没有办法让杰克逊没有传递任何价值,所以可以使用类定义中指定的默认值? – 编辑 – 我用映射器注册了一个KotlinModule()。 使用版本2.7.8或涉及的所有杰克逊软件包。 以下代码 – @Test fun jackson_kotlin_module() { val mapper = ObjectMapper().registerModule(KotlinModule()) println( mapper.readValue("""{ "inJson" : "some value" }""", SomeData::class.java)) } 给我 – com.fasterxml.jackson.databind.JsonMappingException: Instantiation […]