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())

我不知道是否以及如何可以同时支持这两种命名策略。