使用构建器时映射到蛇箱

Fll*_*ppy 6 java jackson lombok

我正在从休息调用接收 json 数据。钥匙都在里面camel case

我可以从其余调用中很好地获取这些数据。但我希望将所有这些密钥转换为snake casecos,这是
我发送回需要我的响应的客户端的版本。

在我的配置中,我有以下内容来映射蛇案例。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setObjectMapper(new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES));
    return converter;
}
Run Code Online (Sandbox Code Playgroud)

如果我不明确使用@JsonProperty并且坚持使用gettersandsetters而不是builder.
例如,如果我的 bean 以以下格式声明,这将起作用并给我蛇形案例。

@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Layout {
    private final String myBanner;
}
Run Code Online (Sandbox Code Playgroud)

@JsonProperty如果我使用构建器但不按如下方式使用,它将无法工作(不会从其余调用中捕获数据) 。

@Getter
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonDeserialize(builder = Layout.LayoutBuilder.class)
public class Layout {
    private final String myBanner;
}
Run Code Online (Sandbox Code Playgroud)

这就是我现在拥有的,可以使用,但是是在骆驼箱中。我想要蛇盒。

@Getter
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonDeserialize(builder = Layout.LayoutBuilder.class)
public class Layout {

    @JsonProperty("myBanner")
    private final String myBanner;
}
Run Code Online (Sandbox Code Playgroud)

我想坚持使用builder. 因此问题是,有没有办法解决这个问题,使用构建器并仍然获取snake case 我的响应值。

或者另一种方法是递归循环对象中的所有字段(包括嵌套对象)并将它们全部切换为蛇形外壳?

来自 REST 调用的 Json 数据

{
    "mainData": {
        "groupData": "",
        "benefits": {
            "summary": {
                "title": "",
                "shortCopy": ""
            }
        },
        "simpleLayout": {
            "myBanner": "summary",
            "titles": [
                [
                    "",
                    ""
                ]
            ]
        },
        "maxLayout": {
            "myBanner": "summary",
            "titles": [
                [
                    ""
                ]
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

无法获取翻译方法的屏幕截图。 在此输入图像描述

在此输入图像描述

ray*_*ray 5

您可以使用@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)注释。

也与Lombok 项目合作。

例如,

@Getter
@Builder
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class YourDto {
    private final String myBanner;

    public YourDto(@JsonProperty("myBanner")
                   @JsonAlias("my_banner") String myBanner) {
        this.myBanner = myBanner;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的类可以反序列化以下 JSON,

{   
    "myBanner": "My own banner.."
}
Run Code Online (Sandbox Code Playgroud)

并序列化为以下 JSON

{
    "my_banner": "My own banner.."
}
Run Code Online (Sandbox Code Playgroud)