Исключение векторной сериализации Джексона - PullRequest
1 голос
/ 17 января 2012

У меня есть следующий код с простым классом и методом для записи и последующего чтения:

ObjectMapper mapper = new ObjectMapper();
  try{
      DataStore testOut = new DataStore();
      DataStore.Checklist ch1 = testOut.addChecklist();
      ch1.SetTitle("Checklist1");

      String output = mapper.writeValueAsString(testOut);
      JsonNode rootNode = mapper.readValue(output, JsonNode.class);
      Map<String,Object> userData = mapper.readValue(output, Map.class);
    }


public class DataStore {
public static class Checklist
{
    public Checklist()
    {

    }
    private String _title;
    public String GetTitle()
    {
        return _title;
    }
    public void SetTitle(String title)
    {
        _title = title;
    }

}
//Checklists
private Vector<Checklist> _checklists = new Vector<Checklist>();
public Checklist addChecklist()
{
    Checklist ch = new Checklist();
    ch.SetTitle("New Checklist");
    _checklists.add(ch);
    return ch;
}
public Vector<Checklist> getChecklists()
{
    return _checklists;
}
public void setChecklists(Vector<Checklist> checklists)
{
    _checklists = checklists;
}
}

Строка: String output = mapper.writeValueAsString (testOut);вызывает исключение, из-за которого я был сбит с толку часами и собирался вообще отказаться от этого.Любые подсказки приветствуются.

Вот исключение: не найден сериализатор для класса DataStore $ Checklist и не обнаружены свойства для создания BeanSerializer (во избежание исключения отключите SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) (через цепочку ссылок: DataStore[ "контрольные списки"] -> java.util.Vector [0])

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Есть несколько способов сделать это, но я начну с того, что вы делаете неправильно: вы называете метод getter и метод setter неверно - в Java используется «camel-case», поэтому вы должны использовать «getTitle»».Из-за этого свойства не найдены.

Помимо переименования методов для использования имен в стиле Java, есть альтернативы:

  • Вы можете использовать аннотацию JsonProperty("title") для GetTitle(),так что свойство распознается
  • Если вам не нужен объект-обертка, вы можете просто добавить @JsonValue для GetTitle(), и в этом случае значение, используемое для всего объекта, будет возвращаемым значением этого метода..
0 голосов
/ 17 января 2012

Кажется, ответ: вы не можете сделать это с Json. Я также видел комментарии в руководстве по Gson, в которых говорится, что некоторые сериализации просто не работают. Я скачал XStream и выплеснул его с помощью XML за несколько минут работы и на много меньше конструкции вокруг того, что я действительно хотел сохранить. В процессе я смог удалить много кода.

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