Jackson SNAKE_CASE 如何在数字前的字段名称中生成下划线
Jackson SNAKE_CASE How to generate underscore in field names before number
我有下和平码
@Test
fun `simple test`() {
val objectMapper = ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
.registerModule(KotlinModule())
val value = objectMapper.writeValueAsString(MyClass(myField1 = "something", myField2 = "something2"))
assertNotNull(value)
}
data class MyClass (
val myField1: String? = null,
@JsonProperty("my_field_2")
val myField2: String? = null,
)
下一个反序列化的结果
{"my_field1":"something","my_field_2":"something2"}
是否可以将 objectMapper 配置为在对象 属性 名称中的数字之前自动填充 _
值,而无需在 @JsonProperty
中指定?
是的,这可以使用 PropertyNamingStrategy
:
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
请注意,您命名的 snake-case 字段不一致,因为 my_field1
的数字前没有 _
,而 my_field_2
的数字前有 _
在数字之前。上面使用 PropertyNamingStrategies.SNAKE_CASE
的配置适用于第一个命名(如 my_field1
)。
如果你想使用第二种命名方式(比如my_field_2
),那么你必须像这样编写自己的命名策略:
class MySnakeCaseStrategy : NamingBase() {
override fun translate(input: String?): String? =
if (input == null) null
else "([A-Z]+|[0-9]+)".toRegex().replace(input) { "_${it.groupValues[1]}".lowercase() }
}
然后可以使用该命名策略来配置您的 object-mapper:
objectMapper.setPropertyNamingStrategy(MySnakeCaseStrategy())
我不知道是否以及如何可以同时支持这两种命名策略。
我有下和平码
@Test
fun `simple test`() {
val objectMapper = ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
.registerModule(KotlinModule())
val value = objectMapper.writeValueAsString(MyClass(myField1 = "something", myField2 = "something2"))
assertNotNull(value)
}
data class MyClass (
val myField1: String? = null,
@JsonProperty("my_field_2")
val myField2: String? = null,
)
下一个反序列化的结果
{"my_field1":"something","my_field_2":"something2"}
是否可以将 objectMapper 配置为在对象 属性 名称中的数字之前自动填充 _
值,而无需在 @JsonProperty
中指定?
是的,这可以使用 PropertyNamingStrategy
:
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
请注意,您命名的 snake-case 字段不一致,因为 my_field1
的数字前没有 _
,而 my_field_2
的数字前有 _
在数字之前。上面使用 PropertyNamingStrategies.SNAKE_CASE
的配置适用于第一个命名(如 my_field1
)。
如果你想使用第二种命名方式(比如my_field_2
),那么你必须像这样编写自己的命名策略:
class MySnakeCaseStrategy : NamingBase() {
override fun translate(input: String?): String? =
if (input == null) null
else "([A-Z]+|[0-9]+)".toRegex().replace(input) { "_${it.groupValues[1]}".lowercase() }
}
然后可以使用该命名策略来配置您的 object-mapper:
objectMapper.setPropertyNamingStrategy(MySnakeCaseStrategy())
我不知道是否以及如何可以同时支持这两种命名策略。