Используя Jackson ObjectMapper для сериализации имени подкласса в JSON, не суперкласса

Две вещи помнить:

  • Это собирается зависеть от синтаксического анализатора CSS / механизм визуализации: т.е. это варьируется от браузера до браузера.

  • CSS действительно, действительно, действительно быстр так или иначе, даже в он является самым медленным, человеческое наблюдение не было должно уведомление

В целом, самые простые вещи являются самыми быстрыми (поскольку Гамбо приятно иллюстрирует), но потому что мы уже находимся в такой быстрой среде, не думают, что необходимо пожертвовать ясностью, и соответствующий обзор (низкая специфика похожа на создание всего общедоступный вид). Просто избегайте * везде, где Вы можете :)

10
задан seansand 25 August 2009 в 01:05
поделиться

3 ответа

Согласно этому сообщению , Jackson 1.5 реализует полную обработку полиморфных типов, и теперь этот код интегрирован в магистраль.

Есть два простых способа выполнить эту работу:

  • Добавить аннотацию @JsonTypeInfo в супертипе (здесь Animal), ИЛИ
  • Настроить сопоставитель объектов, вызвав ObjectMapper.enableDefaultTyping () (но если это так, Animal должен быть абстрактный тип)
10
ответ дан 4 December 2019 в 00:26
поделиться

Я могу придумать единственный способ сделать это, и это уродливо. Есть ли способ лучше?

   @JsonWriteNullProperties(false)
   public static class AnimalContainer
   {
      private Animal animal;

      public Animal getCat()
      {
         return animal instanceof Cat ? animal : null;
      }
      public void setCat(Cat cat)
      {
         this.animal = cat;
      }
      public Animal getDog()
      {
         return animal instanceof Dog ? animal : null;
      }
      public void setDog(Dog dog)
      {
         this.animal = dog;
      }
      public Animal getFish()
      {
         return animal instanceof Fish ? animal : null;
      }
      public void setFish(Fish fish)
      {
         this.animal = fish;
      }
   }
0
ответ дан 4 December 2019 в 00:26
поделиться

This is probably not the answer you are looking for, but there are plans to implement proper "polymorphic deserialization" (and necessary support on serialization for it), for Jackson version 1.4 or so (i.e. not the next one, 1.3, but one after that).

For current version, you have to implement custom serializers/deserializers: I would probably just define factory method for deserialization, and type getter for serializer (define 'getAnimalType' or whatever in abstract base class as abstract, override in sub-classes -- or even just implement in base class, output class name of instance class?).

Anyway, just in case it matters, here are underlying problems wrt implementing handling of sub-classes with JSON, and without schema language (since json doesn't really have widely used one):

  • how to separate data (bean property values) from metadata (type information only needed to construct proper subclasses) -- must be kept separate, but JSON as format has no way to define (could use naming convention)
  • how to add proper annotations to generate and use such metadata; and without depending on language specific features (shouldn't have to tie to java class names for example)

These are solvable problems, but not trivially easy to solve. :-)

2
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: