У меня есть десериализатор для определенного класса, который нуждается в некотором упорядочении при чтении полей. Предположим, у меня есть два поля в моем классе (field1
и field2
), и для того, чтобы читать field2
, ему сначала нужно field1
.Чтение пропущенных детей в Jackson Custom Deserializer
Например для следующих данных JSon это работает, потому что, когда десериализатор разбирает field2
, field1
уже установлен:
{"field1": 3, "field2": 4}
Однако если мы поменяем поля:
{"field2": 4, "field1": 3}
мне нужно пропустить field2
через jp.skipChildren
т.к. field1
не установлен. Когда разобран field1
, Джексон должен перечитать и разобрать field2
.
Один из вариантов состоит в том, чтобы проанализировать поле2 вместо пропуска и удерживать его в переменной, чтобы при установке поля 1 он мог использовать переменную, содержащую данные в поле2. Однако; основанный на значении field1
, мне может не понадобиться разобрать field2
, поэтому я ищу лучшее решение, так как производительность важна в этой части кода.
Я использую метод Mapper.readValue(byte[], MyClass.class)
, и кажется, что Джексон использует ReaderBasedJsonParser
для разбора. Несмотря на то, что можно получить позицию маркера, я не смог найти способ установить позицию маркера.
У вас возникла проблема в том, что вы полагаетесь на порядок членов объекта, который RFC для JSON (RFC 7159) говорит, что это не имеет значения. Зачем вам заказ? Почему бы вам просто не попробовать и десериализировать оба? – fge
@fge Поскольку определенное поле содержит информацию о том, как следует анализировать другие поля. Разбор дерева JSON для общего JsonNode - это всегда вариант, но он имеет накладные расходы, поэтому я хотел его избежать. – Boyolame
@fge, так как вы знаете об Avro, я хотел бы разобрать JSON на модель Avro. Некоторые из полей в JSON содержат информацию об схеме Avro, поэтому, чтобы разобрать дерево, сначала мне нужно знать эти значения. Вы можете посмотреть код отсюда: https://github.com/buremba/rakam/blob/19d96f7ff35df81b4faa4a57452520f905122c74/src/main/java/org/rakam/collection/event/EventDeserializer.java – Boyolame