Есть ли какая-то условная стратегия Джексона Джсона? - PullRequest
3 голосов
/ 13 апреля 2011

Мне нужно десериализовать GeoJSON JSON объект с библиотекой Джексона.В этом объекте json есть места, где это применимо:
Если есть

"type" : "name"  

, то следующий объект json имеет один тип.Скажем, например:

"properties": {
   "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}  

С другой стороны, если есть

"type": "link"  

, тогда следующий объект json другого типа.Скажем, например:

"properties": {  
   "href": "http://example.com/crs/42",  
   "type": "proj4"  
}  

Теперь у меня есть PropertiesPOJO, который содержит:

private String name;  
private String href;
private String type;

Текущее решение требует проверки типа объекта, чтобы мы знали, какие частиСвойства POJO мы хотим рассмотреть. Это не очень хорошая практика.Я бы предпочел сделать это с помощью специального десериализатора, который будет десериализован непосредственно в NamePropertiesPOJO или LinkPropertiesPOJO.Одна идея, которая у меня была, это поместить

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
NamePropertiesPOJO namePropertiesPOJO = null;

@JsonDeserialize(using=PropertiesDeserializer.class)
@JsonProperty("properties")
LinkPropertiesPOJO linkPropertiesPOJO = null;

Но я получаю

Произошло JsonMappingException: несколько полей, представляющих свойство "properties":

Итак, есть ли какой-нибудь другой способ сделать это с помощью аннотаций Джексона?

С уважением,
Деспот

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Это известно как «Внешний идентификатор типа», и хотя он еще не поддерживается Джексоном (в отличие от идентификаторов типов, которые будут встроены в Object; в данном случае, как одно дополнительное свойство), это то, что поддержка должна быть добавлено в будущем, согласно JACKSON-453 . Это не будет сделано в 1.8, но, надеюсь, для версии после этого. GeoJSON - это часто повторяющийся сценарий использования. Хотелось бы, чтобы они выбрали более распространенный механизм, но из-за популярности формата это очень важно для поддержки.

0 голосов
/ 14 апреля 2011

Полагаю, простой ответ был бы: стратегии условной десериализации Джексона-Джсона не существует.

Приветствия
Деспот
П.С .: Если кто-то даст мне решение проблемы (кроме «нет»), я с радостью перенесу проверку ответа на его ответ!

0 голосов
/ 13 апреля 2011

Вы должны быть в состоянии сделать это через

class Pojo {
    Map<String,String> properties;
    ...
}

А затем просто прочитать материал с карты.

Также, когда у вас есть только то POJO, которое вы показали без аннотаций, Джексон также должен иметь возможность самостоятельно заполнять нужные переменные.И в установщиках вы можете установить флаг, это тип 1 или тип 2, так что вы можете затем сделать if (pojo.isType1())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...