Java - сериализация POJO Джексон 2.0 - PullRequest
0 голосов
/ 09 февраля 2019

Я сканировал переполнение стека весь день и не нашел жизнеспособного решения для моей проблемы.

У меня есть pojo, у которого есть примитивные типы и вложенные объекты.Например ...

@JsonIgnoreProperties({"duration", "errorCode", "haveFieldsChanged", 
"serviceRequestToken", "storedProcDuration"}) // Abstract Base Class 
 properties
class Bus extends AbstractBaseClass implements Serializable{

    @JsonIgnore
    private static final long serialVersionId = 1;

    @JsonProperty("name")
    String name;

    @JsonProperty("id")
    int id;

    @JsonProperty("students")
    List<Student> students; // Nested Objects

    @JsonProperty("employer")
    Employer employer; //Nested object

    // Getters and setters - none are annotated

@JsonRootName(value = "student")
class Student implements Serializable{
    // student fields
}

@JsonRootName(value = "statusType")
class Employer implements Serializable{

    @JsonProperty("id")
    int id;
}

Когда я сериализую свой объект Bus, у Джексона не будет проблем с созданием правильной структуры для имени, идентификатора и моего списка студентов.Тем не менее, он будет пропускать работодателя полностью, оставляя его отсутствующим в JSON.Увидеть ниже.

{
  "name":"Sean",
  "id": 1,
  "students":[student objects...]
}

Я пробовал @JsonProperty, @JsonSerialize (as = Employer.class), я пытался построить карту для объекта работодателя.Я чувствую, что исчерпал большинство вариантов.Есть что-то, чего мне не хватает?

Я столкнулся с исключениями переполнения стека, пробуя другие аннотации.Я ценю любую помощь, которую я могу получить.

Причина, по которой я добавил @JsonProperty к полям, заключается в том, чтобы помочь осуществить десериализацию.Я думаю, что это может быть основной причиной сериализации, но я не уверен.

Реализация сериализации

private String serializeBus(Bus bus) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
    mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
    String json = null;
    try {
        json = mapper.writeValueAsString(bus);
    } catch (JsonProcessingException e) {
        logger.error("Error serializing bus");
        throw new Exception(e);
    }
    return json;
}

Спасибо!

1 Ответ

0 голосов
/ 11 февраля 2019

Итак, если вы не можете поделиться кодом, я приведу ваш пример выше в небольшом проекте песочницы: https://github.com/mle-enso/stackoverflow В настоящее время он работает с Spring Boot 2.1, но также снижает версию управляемого Джексона.) на 2.6.1 не оказывает негативного влияния.

Возможно, вы можете попробовать этот проект с простым mvn clean verify или ручным тестовым прогоном de.mle.stackoverflow.jackson.BusSerializerTest, чтобы углубиться в эту проблему здесь.

...