假设我有一个包含一个变量的类:
@Data
public class Student {
private List<Grade> allGrades;
}
这将被发送到用Python编写的生产者。他们希望拥有snake_case
的属性,我们希望将camelCase
保留在java中。
这可以通过杰克逊来实现:
@Data
public class Student {
@JsonProperty("all_grades")
private List<Grade> allGrades;
}
现在,我们正在构建一个可以在生产者之间动态切换的应用程序,因此有些可能是用Java编写的,有些可能是用Python编写的。
在我们的应用程序中,我们可以通过将它存储在配置中或将其作为请求标头发送来了解这一点。
如果生产者是 Java,我们希望避免重命名该属性。所以主要问题是:
(如何(是否可以有条件地将属性 allGrades 重命名为基于字符串/布尔值的all_grades?
我敢肯定杰克逊开箱即用不支持这一点,我认为也不应该支持。如果你真的必须做这样的事情,你可以为不同的生产者子类Student
类,例如
@Data
class Student {
private List<Grade> allGrades;
@JsonProperty
List<Grade> getAllGrades() {
return allGrades;
}
}
@Data
@EqualsAndHashCode(callSuper = true)
class PythonStudent extends Student {
@JsonProperty("all_grades")
@Override
public void getAllGrades() {
super.getAllGrades();
}
}
然后根据您在工厂类中的条件构造所需的对象。
也就是说,使用 snake_case 或 camelCase 约定在 Java 和 Python 中使用 JSON 字符串并将它们映射到所需格式的字段非常容易。我不认为你想要实现的目标会增加任何价值,但它肯定会带来很多复杂性。