Десериализовать сообщение из JSON в POJO, используя Джексона - PullRequest
3 голосов
/ 22 марта 2012

Как бы вы десериализовали документ JSON в POJO, используя Джексона, если вы не знали точно, какой тип POJO использовать, не просматривая сообщение. Есть ли способ зарегистрировать набор POJO с Джексоном, чтобы он мог выбрать один на основе сообщения?

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

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Мне не известен механизм, который вы описываете. Я думаю, вам придется проверить JSON самостоятельно:

    Map<String, Class<?>> myTypes = ... 
    String json = ...
    JsonNode node = mapper.readTree(json);
    String type = node.get("type").getTextValue();
    Object myobject = mapper.readValue(json, myTypes.get(type));

Если у вас нет поля типа, вам придется проверить поля в JsonNode, чтобы определить тип.

0 голосов
/ 23 апреля 2013

BeanDeserializer, в Джексоне устарела. Однако у меня была та же проблема, и я решил ее, используя Google GSon . Посмотрите на этот пример.

Учитывая ваш тип данных POJO:

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}
  • Сериализация

    BagOfPrimitives obj = new BagOfPrimitives();
    Gson gson = new Gson();
    String json = gson.toJson(obj);  // ==> json is {"value1":1,"value2":"abc"}
    

Обратите внимание, что вы не можете сериализовать объекты с циклическими ссылками, поскольку это приведет к бесконечной рекурсии.

  • Десериализация

    BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
    
0 голосов
/ 22 марта 2012

Если у вас есть гибкость в вашей библиотеке JSON, взгляните на Джексон .Он имеет BeanDeserializer , который можно использовать для этой цели.

...