Принуждение Джексона к десериализации определенного свойства в определенный примитивный тип

Я использую jackson 2.9.6 У меня есть объект, который я хочу сериализовать и десериализовать. Вот класс 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

}

Данные 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 Data первым 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 для преобразования данных json в этот объект класса, но я не знаю, делают ли они это.


person World Programing    schedule 31.07.2018    source источник
comment
Должен ли id быть типом оболочки? Можете ли вы изменить его на примитив 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