บังคับให้แจ็คสันทำการดีซีเรียลไลซ์คุณสมบัติเฉพาะไปเป็นประเภทดั้งเดิมเฉพาะ

ฉันใช้ jackson 2.9.6 ฉันมีวัตถุที่ฉันต้องการทำให้เป็นอนุกรมและดีซีเรียลไลซ์ นี่คือชั้นเรียน Post

โพสต์.จาวา

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

}

ข้อมูล 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
        }
    ]
}

ฉันใช้ ObjectMapper ในการอ่านและเขียนเช่นนี้

สำหรับการเขียน

 objectMapper.writeValue(fileDir, postObject);

สำหรับการอ่าน

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

อย่างที่คุณเห็นว่ามีข้อผิดพลาด can't cast int to long post['id'] และเหมือนกันใน commentList นี่เป็นเพราะใน ข้อมูล Json อันดับแรก id คือ 123 ดังนั้น jackson ให้พิจารณาว่าเป็น int และพยายามบันทึกไว้ใน Long id

ฉันเห็นคำตอบบน StackOverFlow ที่ใช้ DeserializationFeature.USE_LONG_FOR_INTS แต่ฉันใช้ไม่ได้เพราะมีคุณสมบัติอื่น count ที่ฉันต้องการใน int

ถ้าฉันใช้ DeserializationFeature.USE_LONG_FOR_INTS มันแสดงข้อผิดพลาดว่า Long ไม่สามารถส่งไปยัง int post['count'] และเหมือนกับ commentList

ฉันต้องการถามว่ามีวิธีใดบ้างที่ฉันสามารถแปลงคุณสมบัติเฉพาะเป็นประเภทดั้งเดิมเฉพาะได้ ตัวอย่างเช่นในกรณีนี้ ฉันต้องการคุณสมบัติ id อยู่ใน Long เสมอทั้งใน Post และ Comment คุณสมบัติอื่นๆ ดีหมดครับ

คุณช่วยบอกฉันหน่อยได้ไหมว่าฉันจะทำอย่างไร

อัปเดต

คลาส Post และ Comment เป็นคลาสที่สร้างขึ้นโดยอัตโนมัติ และไม่สามารถทำการเปลี่ยนแปลงใดๆ ในไฟล์เหล่านี้ได้ จริงๆ แล้วฉันใช้ ปลายทางระบบคลาวด์ของ Google v2 ไฟล์เหล่านี้สร้างโดย ปลายทางระบบคลาวด์ จุดสิ้นสุดของคลาวด์ใช้ jackson lib เดียวกันในการแปลงข้อมูล json เป็นวัตถุคลาสเหล่านี้ แต่ฉันไม่รู้ว่ามันทำ


person World Programing    schedule 31.07.2018    source แหล่งที่มา
comment
id จำเป็นต้องเป็นประเภท wrapper หรือไม่ คุณสามารถเปลี่ยนเป็นดั้งเดิม long ได้หรือไม่?   -  person ernest_k    schedule 31.07.2018
comment
ฉันไม่สามารถทำการเปลี่ยนแปลงใดๆ ในไฟล์เหล่านี้ ฉันอัปเดตคำถามของฉัน โปรดตรวจสอบ   -  person World Programing    schedule 31.07.2018


คำตอบ (1)


คุณสามารถใช้ @JsonSetter เพื่อแก้ไขปัญหานี้ได้

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;
}
}

ปัญหาหนึ่งใน json ของคุณ , หายไป

"นับ" : 1

"นับ" : 5

person GolamMazid Sajib    schedule 31.07.2018
comment
ขออภัย ฉันไม่ได้บอกว่าไฟล์เหล่านี้สร้างขึ้นโดยอัตโนมัติ และฉันไม่สามารถทำการเปลี่ยนแปลงใดๆ ได้ ฉันอัปเดตคำถามของฉัน โปรดตรวจสอบ - person World Programing; 31.07.2018
comment
json ของคุณถูกต้องไหม? ฉันเห็นว่ามันหายไป , - person GolamMazid Sajib; 31.07.2018
comment
แม้ไม่สามารถทำให้เกิดปัญหาของคุณได้ รหัสของคุณทำงานได้ดีโดยไม่ต้องตั้งค่า '@JsonSetter` - person GolamMazid Sajib; 31.07.2018
comment
โอ้ ฉันตรวจสอบคำจำกัดความของคลาส คลาสเหล่านี้ขยายจาก GenericJson บางทีนี่อาจเป็นการสร้างปัญหา เพราะโค้ดนี้ใช้งานไม่ได้สำหรับฉัน และฉันยังอัปเดตข้อมูล Json เพื่อลบข้อผิดพลาดเหล่านี้ด้วย - person World Programing; 31.07.2018