2015-02-24 7 views
3

У нас есть класс, содержащий несколько наборов длин. Мы хотим, чтобы они были сериализованы как массивы, и большинство клиентов делают это.Jackson - Используйте специальный десериализатор только для конкретного JSON

Однако у нас есть клиент PHP, который создает такие множества, что они сериализуются нечетным образом. Набор с номером 4 приходит так:

"setOfNumbers": { 
    "4": 0 
}, 

Естественно, Джексон жалуется на это является объектом, а не массив. То, что я хотел бы, чтобы иметь собственный десериализации, который вызывается только если Джексон обнаруживает объект, где Set<Long> должен быть

Я попытался это (и в идеале, только если они содержатся в специальных классах.):

this.addDeserializer(Set.class, new StdDelegatingDeserializer<>(new StdConverter<Map<String, Long>, Set<Long>>() { 
     @Override 
     public Set<Long> convert(Map<String, Long> set) { 
      return parseLongs(set); 
     } 
    })); 

Проблема в том, что теперь он ожидает объект вместо массива для всех полей Set. Вызывается десериализованный класс, поэтому я не могу добавлять какие-либо аннотации или делать другие изменения.

+0

PHP, кажется, есть ряд творческих интерпретаций JSON. – chrylis

ответ

1

Если сгенерированный класс всегда имеет такое же имя, вы можете попробовать с Json Jackson Mix в аннотации, как показано в этом example