Я пытаюсь создать JSON на основе моего класса объектов POJO. Для некоторых полей я хотел бы использовать CustomSerializer, поскольку я хотел бы создать поля в соответствии с моим требованием. Следовательно, я создал файл CustomSerializer.class
.
CustomSerializer
будет вызываться двумя разными полями в моем POJO
, и я хотел бы обрабатывать вещи по-разному в зависимости от того, какое поле вызывает вызов. Для одного из полей (extensions
) я хотел бы иметь fieldName
, а для другого поля (withoutExtensions
) я не хочу иметь fieldname
в своем JSON.
Проблема, с которой я сталкиваюсь, заключается в том, что когда вызывается CustomSerializer
, я получаю одно и то же fieldname
для обоих вызовов, из-за чего я не могу определить, какое поле в настоящее время вызывает CustomSerializer
.
Следующие примеры кода дадут больше ясности по проблеме, с которой я столкнулся:
Customer
Класс POJO, используемый для сериализации JSON:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@NoArgsConstructor
public class Customer {
private String isA;
private String name;
@JsonSerialize(using = CustomSerializer.class)
private Map<String, Object> extensions = new HashMap<>();
private Map<String, Object> withoutExtensions = new HashMap<>();
@JsonAnyGetter
@JsonSerialize(using = CustomSerializer.class)
public Map<String, Object> getWithoutExtensions() {
return withoutExtensions;
}
}
Ниже приведен мой CustomSerializer
, который будет вызываться двумя полями (расширениями и без расширений) во время создания JSON:
public class CustomSerializer extends JsonSerializer<Map<String, Object>> {
@Override
public void serialize(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) {
//I would like to create the outer object for "Extensions" but do not want to create outer object for "WithoutExtensions"
System.out.println(gen.getOutputContext().getCurrentName());
//In my case for both "Extensions" and "WithoutExtensions" i get the "currentName" as "Extensions" how can I ensure which field is calling this sealizer at
// present
}
}
Ниже приведен мой класс Main
, который создаст JSON:
public class Main {
public static void main(String[] args) throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
final Customer customer = new Customer();
customer.setName("Jackson");
Map<String, Object> extensions = new HashMap<>();
extensions.put("WithObject", "With");
customer.setExtensions(extensions);
Map<String, Object> withoutExtensions = new HashMap<>();
extensions.put("WithoutObject", "Without");
customer.setWithoutExtensions(withoutExtensions);
final String eventAsJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(customer);
System.out.println(eventAsJson);
}
}
Как мы видим, когда я запускаю приложение, CustomSerializer
будет печатать extensions
в обоих случаях. Я считаю, что он должен печатать extensions
только один раз, а в следующем случае он должен предоставить либо withoutExtensions
, либо пустую строку.
Я просто хотел знать, является ли это ошибкой со стороны Джексона или есть какой-то обходной путь, который я могу попытаться определить, какое поле вызывает мой CustomSerializer
.
Любая помощь могла бы быть полезна. Спасибо.