Memaksa Jackson untuk melakukan deserialisasi properti tertentu ke tipe primitif tertentu

Saya menggunakan jackson 2.9.6 Saya memiliki objek yang ingin saya serialisasi dan Deserialisasi. Ini kelas Post

Post.java

public class Post  extends GenericJson {

    private Long id;
    private String name;
    private int count;

    private List<Comment> commentList;

    // Getter and setter

}

public class Comment  extends GenericJson{

    private Long id;
    private String text;
    private int count;

    // Getter and setter

}

Data JSON

{
    "id" : 123,
    "name" : "azeem",
    "count" : 1,
    "commentList" : [
        {
            "id" : 312,
            "text" : "simple comment",
            "count" : 3
        },
        {
            "id" : 31221231231231,
            "text" : "simple comment 2",
            "count" : 1
        }
    ]
},

    "id" : 123127877186786,
    "name" : "arfan",
    "count" : 5,
    "commentList" : [
        {
            "id" : 312,
            "text" : "simple comment",
            "count" : 3
        },
        {
            "id" : 31221231231231,
            "text" : "simple comment 2",
            "count" : 1
        }
    ]
}

Saya menggunakan ObjectMapper untuk membaca dan menulis, seperti ini.

Untuk Menulis

 objectMapper.writeValue(fileDir, postObject);

Untuk Dibaca

 objectMapper.readValue(savedFileDir, Post.class); // Error can't cast int to long

Seperti yang Anda lihat, ada kesalahan tidak dapat melakukan cast ke postingan panjang['id'] dan hal yang sama terjadi di commentList ini karena di Json Data id pertama adalah 123 Jadi jackson anggap saja sebagai int dan coba simpan di Long id

Saya melihat jawaban di StackOverFlow yang menggunakan DeserializationFeature.USE_LONG_FOR_INTS Namun saya tidak dapat menggunakannya karena ada properti lain count yang saya perlukan di int.

Jika saya menggunakan DeserializationFeature.USE_LONG_FOR_INTS itu menunjukkan kesalahan yang Panjang tidak dapat ditransmisikan ke int posting['count'] dan sama dengan commentList

Saya ingin bertanya apakah ada cara saya dapat mengonversi properti tertentu ke tipe primitif tertentu. Misalnya dalam hal ini saya ingin properti id selalu di Long di Post dan Comment. Lainnya semua properti baik-baik saja.

Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu.

Perbarui

Kelas Post dan Comment dibuat secara otomatis dan tidak dapat membuat perubahan apa pun pada file ini. Sebenarnya saya menggunakan Google cloud endpoints v2 file ini dihasilkan oleh cloud endpoint. Titik akhir cloud menggunakan jackson lib yang sama untuk mengonversi data json menjadi objek kelas ini tetapi saya tidak tahu mereka melakukannya.


person World Programing    schedule 31.07.2018    source sumber
comment
Apakah id harus berupa tipe pembungkus? Bisakah Anda mengubahnya ke long primitif?   -  person ernest_k    schedule 31.07.2018
comment
Saya tidak dapat membuat perubahan apa pun pada file ini, saya memperbarui pertanyaan saya, silakan periksa   -  person World Programing    schedule 31.07.2018


Jawaban (1)


Anda dapat menggunakan @JsonSetter untuk mengatasi masalah ini.

public class Post {

private Long id;
private String name;
private int count;

private List<Comment> commentList;

// Getter and setter


@JsonSetter
public void setId(int id) {
    this.id = (long) id;
}
}

Satu masalah di json Anda. , hilang.

"hitungan" : 1

"hitungan" : 5

person GolamMazid Sajib    schedule 31.07.2018
comment
Maaf, saya tidak menyebutkan file-file ini dibuat secara otomatis dan saya tidak dapat melakukan perubahan apa pun padanya. Saya memperbarui pertanyaan saya, silakan periksa. - person World Programing; 31.07.2018
comment
apakah json Anda valid? aku lihat ada yang hilang , - person GolamMazid Sajib; 31.07.2018
comment
bahkan tidak dapat mereproduksi masalah Anda. Kode Anda berfungsi dengan baik tanpa menyetel '@JsonSetter` - person GolamMazid Sajib; 31.07.2018
comment
Ohh, saya memeriksa definisi Kelas, kelas-kelas ini diperluas dari GenericJson mungkin ini menimbulkan masalah Karena kode ini tidak berfungsi untuk saya. Dan saya juga memperbarui data Json untuk menghilangkan kesalahan ini - person World Programing; 31.07.2018