Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, aber für das, was ich verstehen konnte, können Sie so etwas tun, um verschiedene Serialisierungen zu erreichen.
Erstellen Sie eine benutzerdefinierte Anmerkung alle möglichen verschiedenen Serialisierungsoptionen zu halten:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomJsonProperty {
String propertyName();
String format();
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
CustomJsonProperty[] value();
}
}
Beschriften Sie Ihre Klasse entsprechend:
@JsonSerialize(using = CustomJsonPropertySerializer.class)
public class Bar {
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "first-name", format = "A"),
@CustomJsonProperty(propertyName = "firstName", format = "B")
})
private String firstName;
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "last-name", format = "A"),
@CustomJsonProperty(propertyName = "lastName", format = "B")
})
private String lastName;
@CustomJsonProperty.List({
@CustomJsonProperty(propertyName = "gender-x", format = "A"),
@CustomJsonProperty(propertyName = "gender", format = "B")
})
private String gender;
@JsonIgnore
private String format;
//getters & setters
}
Erstellen eines benutzerdefinierten Serializer Ihre neue Anmerkung zu interpretieren:
public class CustomJsonPropertySerializer extends JsonSerializer<Bar> {
@Override
public void serialize(Bar bar, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartObject();
Field[] fields = bar.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object value = null;
try {
value = field.get(bar);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (field.isAnnotationPresent(CustomJsonProperty.List.class)) {
CustomJsonProperty[] properties = field.getAnnotation(CustomJsonProperty.List.class).value();
CustomJsonProperty chosenProperty = null;
for (CustomJsonProperty c : properties) {
if (c.format().equalsIgnoreCase(bar.getFormat())) {
chosenProperty = c;
break;
}
}
if (chosenProperty == null) {
//invalid format given, use first format then
chosenProperty = properties[0];
}
jsonGenerator.writeStringField(chosenProperty.propertyName(), value.toString());
}
}
jsonGenerator.writeEndObject();
}
}
Jetzt können Sie Ihre Objekte serialisieren unter Berücksichtigung verschiedene Formate für die Eigenschaftsnamen:
public static void main(String[] args) throws IOException {
Bar bar1 = new Bar("first", "last", "m", "A");
Bar bar2 = new Bar("first", "last", "m", "B");
ObjectMapper mapper = new ObjectMapper();
String json1 = mapper.writeValueAsString(bar1);
String json2 = mapper.writeValueAsString(bar2);
System.out.println(json1);
System.out.println(json2);
}
Ausgang:
{"first-name":"first","last-name":"last","gender-x":"m"}
{"firstName":"first","lastName":"last","gender":"m"}
Natürlich ist die oben Serializer nur für Bar Objekte funktionieren, aber das leicht gelöst werden kann Vererbung mit abstract String getFormat();
auf der Super-Klasse und Ändern der benutzerdefinierte Serializer, um den Super-Class-Typ anstelle von Bar zu akzeptieren.
Vielleicht gibt es einen einfacheren Weg als das Erstellen eigener Sachen, aber ich weiß es nicht. Lass es mich wissen, wenn etwas nicht klar war und ich es noch einmal ausarbeiten kann.