Десериализовать объект Джексона / Json, содержащий список <Object>, где тип списка является свойством объекта - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь десериализовать объект json, который содержит список, где тип списка является свойством объекта. То есть

public class TableOutput 
{
    private String hash;
    private String table;  // contains the object type in data list
    private List<Object> data;
}

У меня есть ограничение: генерируются бины, в которые я хочу десериализоваться, и я не могу их изменить. Я уверен, что мне нужен собственный десериализатор JsonDeserializer. Я поставил десериализатор на тип данных:

@JsonDeserialize(contentAs = TableOutputDeserializer.class)
private List<Object> data;

Десериализатор работает, но проблема в том, что я не могу получить свойство таблицы от родительского объекта. Я получаю объект TableOutput, и свойство hash имеет правильное значение, но свойство table имеет значение null. Я просто догадываюсь, но я думаю, что objectMapper обрабатывает свойство 'data' перед свойством 'table'.

Вот мой JsonDeserializer:

public class TableOutputDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
    // Get reference to ObjectCodec
    ObjectCodec codec = jp.getCodec();

    // Parse "object" node into Jackson's tree model
    JsonNode node = codec.readTree(jp);

    // Get the TableOutput object
    TableOutput tableOutput=(TableOutput)jp.getParsingContext().getParent().getCurrentValue();

    // got a valid tableOutput instance. 
    String objectType=tableOutput.getTable(); // objectType is always null!!!

    Iterator<JsonNode> elements = node.elements();
    ... more stuff ...

Мне нужно иметь возможность получить свойство таблицы, чтобы я знал, какие объекты нужно создать для списка. Предложения?

1 Ответ

0 голосов
/ 29 октября 2018

Возможно, используйте универсальное значение для объекта. Не могу с уверенностью сказать, что это будет работать в вашем случае, но при использовании GSON для настройки моих объектов JSON я установил универсальный класс, чтобы при импорте объекта JSON я мог сказать, какой тип объекта использовать в список. Что-то вроде

public class JsonClass <T> {
  private List<T> unknownItems;
}

затем используйте его со ссылкой на класс, который вы хотите видеть в списке.

...