Spring Boot Jackson/ Sping Boot -将snake_case模型序列化为camelCase

7vux5j2d  于 2023-01-26  发布在  Spring
关注(0)|答案(1)|浏览(146)

我使用我的REST API camelCase调用第三方graphQL API,它返回snake_case中的对象。为此,我使用一个库来生成Map器和模型文件(graphql-java-codegen)。

class MyModel {
  public my_string;
  //...
}

我不能强制在camelCase中生成模型,我希望直接将生成的模型作为ResponseObjects返回给我的客户机,但是希望序列化在camelCase中进行,而不需要复制生成的模型和camelCase字段。

{
  "myString": "Example str"
}

在我的代码生成配置中,我能够在类和字段级别添加注解(但是无法在每个字段上定制注解,所以没有@JsonProperty("myString"
tl;dr:是否有一些注解/ Sping Boot 配置可以用来强制使用snake_case命名的模型序列化为camelCase,而无需为每个字段指定@JsonProperty

1zmg4dgp

1zmg4dgp1#

您可以创建一个定制的PropertyNamingStrategy子类,并将其设置为一个仅用于序列化的ObjectMapperMap器的默认命名策略(您可以检查this以将字符串从snake_case转换为camelcase):

public class SnakeCaseToCamelCase extends PropertyNamingStrategy {

    @Override
    public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
        return Pattern.compile("_([a-z])")
                      .matcher(defaultName)
                      .replaceAll(m -> m.group(1).toUpperCase());
    }
}

public class MyModel {
    public String my_string = "Example str";
}

MyModel model = new MyModel();
mapper.setPropertyNamingStrategy(new SnakeCaseToCamelCase());
//it prints {"myString":"Example str"}
System.out.println(mapper.writeValueAsString(model));

相关问题