JSON JSON десериализация - синтетический список получения - PullRequest
3 голосов
/ 06 июля 2011

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

public List<Team> getTeams() {
   // create the teams list
}

где список не является приватным, но генерируется на лету. Теперь это хорошо сериализуется, но в десериализации используется getTeams, предположительно потому, что Джексон видит геттер с изменяемым списком и думает, что он может использовать его как сеттер. Внутренние элементы getTeams опираются на другие области, которые Джексон еще не заполнил. Результатом является NPE, то есть, я думаю, что порядок - это одна из проблем, но я не хочу ее решать.

Итак, я хотел бы аннотировать getTeams, чтобы он никогда не использовался как установщик, а - это , используемый как получатель. Это возможно? Есть предложения?

1 Ответ

4 голосов
/ 06 июля 2011

Отключить DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS.

mapper.configure(DeserializationConfig.Feature.USE_GETTERS_AS_SETTERS, false);

Используйте статический импорт, чтобы сделать эту строку короче.

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

public class Foo
{
  @JsonSetter("teams")
  public void asdf(List<Team> teams)
  {
    System.out.println("hurray!");
  }

  public List<Team> getTeams()
  {
    // generate unmodifiable list, to fail if change attempted
    return Arrays.asList(new Team());
  }

  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    String fooJson = mapper.writeValueAsString(new Foo());
    System.out.println(fooJson);
    // output: {"teams":[{"name":"A"}]}

    // throws exception, without @JsonSetter("teams") annotation
    Foo fooCopy = mapper.readValue(fooJson, Foo.class);
    // output: hurray!
  }
}

class Team
{
  public String name = "A";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...