Конфигурация Джексона для записи enum как объекта - PullRequest
0 голосов
/ 25 ноября 2011

Когда я пытаюсь сериализовать и десериализовать Set<ClassA<?>> универсальных объектов, которые выглядят следующим образом:

public class ClassA<T> {

private ClassB datum;
private T value;
...
}

Если это T перечисление, оно записывается как строковое значение. Это хорошо для сериализации, но когда я десериализую, невозможно узнать, является ли значение String перечислением или нет. Затем Джексон превращает полученный объект в строку, и вы получаете ClassA<String> вместо ClassA<SomeEnumType>.

Есть ли в Джексоне конфигурация, позволяющая создать некоторые намеки на то, что значение является перечислением? Или, может быть, превратить перечисление в объект JSON, а не в строковое значение?

1 Ответ

1 голос
/ 25 ноября 2011

Есть ли в Джексоне конфигурация, позволяющая создать несколько подсказок о том, что значение является перечислением?

Возможно десериализацию в экземпляр перечисления из соответствующего строкового значения JSON.Или это как-то не применимо к вашей ситуации?

Вот пример.

import java.util.Set;
import java.util.TreeSet;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.type.TypeFactory;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);

    String myEnumJson = mapper.writeValueAsString(MyEnum.MyEnum1);

    System.out.println(myEnumJson);

    MyEnum myEnum = mapper.readValue(myEnumJson, MyEnum.class);

    System.out.println(myEnum);

    Set<ClassA<MyEnum>> set = new TreeSet<ClassA<MyEnum>>();
    set.add(new ClassA<MyEnum>(new ClassB("bValue7"), MyEnum.MyEnum1));
    set.add(new ClassA<MyEnum>(new ClassB("bValue8"), MyEnum.MyEnum2));
    String setJson = mapper.writeValueAsString(set);
    System.out.println(setJson);

    TypeFactory typeFactory = TypeFactory.defaultInstance();

    Set<ClassA<MyEnum>> setCopy = mapper.readValue(setJson,
        typeFactory.constructCollectionType(Set.class,
            typeFactory.constructParametricType(ClassA.class, MyEnum.class)));
    System.out.println(setCopy);
  }
}

class ClassA<T> implements Comparable<ClassA<T>>
{
  ClassB datum;
  T value;

  ClassA()
  {
  }

  ClassA(ClassB datum, T value)
  {
    this.datum = datum;
    this.value = value;
  }

  @Override
  public int compareTo(ClassA<T> o)
  {
    return 42;
  }

  @Override
  public String toString()
  {
    return String.format("ClassA: datum=%s, value=%s", datum, value);
  }
}

class ClassB
{
  String bValue;

  ClassB()
  {
  }

  ClassB(String bValue)
  {
    this.bValue = bValue;
  }

  @Override
  public String toString()
  {
    return String.format("ClassB: bValue=%s", bValue);
  }
}

enum MyEnum
{
  MyEnum1("myEnum1", 1), MyEnum2("myEnum2", 2);

  String name;
  int id;

  MyEnum(String name, int id)
  {
    this.name = name;
    this.id = id;
  }
}

Вывод:

"MyEnum1"
MyEnum1
[{"datum":{"bValue":"bValue7"},"value":"MyEnum1"},{"datum":{"bValue":"bValue8"},"value":"MyEnum2"}]
[ClassA: datum=ClassB: bValue=bValue7, value=MyEnum1, ClassA: datum=ClassB: bValue=bValue8, value=MyEnum2]

Если по какой-то причине необходимо иметь перечислениясериализуется как POJOs, затем кажется, что требуется специальная обработка сериализации. Сериализация перечислений с Джексоном

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