Saya mencoba membuat JSON berdasarkan POJO kelas Objek saya. Untuk beberapa bidang, saya ingin menggunakan CustomSerializer karena saya ingin membuat bidang sesuai dengan kebutuhan saya. Oleh karena itu, saya telah membuat CustomSerializer.class
.
CustomSerializer
akan dipanggil oleh 2 bidang berbeda di POJO
saya dan saya ingin menangani hal-hal secara berbeda berdasarkan bidang mana yang melakukan panggilan. Untuk salah satu bidang (extensions
) saya ingin memiliki fieldName
dan untuk bidang lainnya (withoutExtensions
) saya tidak ingin memiliki fieldname
di JSON saya.
Masalah yang saya hadapi adalah ketika CustomSerializer
dipanggil maka saya mendapatkan fieldname
yang sama untuk kedua panggilan tersebut karena itu saya tidak dapat membedakan bidang mana yang saat ini memanggil CustomSerializer
.
Contoh kode berikut akan memberikan kejelasan lebih lanjut tentang masalah yang saya hadapi:
Customer
Kelas POJO yang digunakan untuk membuat serial 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;
}
}
Berikut ini adalah CustomSerializer
saya yang akan dipanggil oleh 2 bidang (ekstensi dan tanpaEkstensi) selama pembuatan 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
}
}
Berikut ini adalah kelas Main
saya yang akan membuat 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);
}
}
Seperti yang bisa kita lihat ketika saya menjalankan aplikasi, CustomSerializer
akan mencetak extensions
dalam kedua kasus. Saya percaya itu harus mencetak extensions
hanya sekali dan dalam kasus berikutnya ia harus memberikan withoutExtensions
atau string kosong.
Saya hanya ingin tahu apakah ini bug di pihak Jackson atau adakah solusi yang bisa saya coba untuk membedakan bidang mana yang melakukan panggilan ke CustomSerializer
saya.
Bantuan apa pun akan sangat dihargai. Terima kasih.