Джексон десериализует класс-оболочку с массивом примитивных типов - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть класс следующим образом, оборачивая массив байтов:

public final class Plan {
  private byte[] bytes;
  private int peekIdx;

  public Plan(byte[] bytes, int peekIdx) {
      this.bytes = bytes;
      this.peekIdx = peekIdx;
  }

  public Plan(byte[] bytes) {
      this(bytes, 0);
  }

  //bunch more methods
}

Содержится в других объектах как

public final class Agent {
     private Plan plan;
     //bunch more properties...
}

Теперь я хочу десериализовать JSON, как

{"plan": [0, 1, 2]}

в качестве агента. Однако я не могу понять, как аннотировать Plan, чтобы добиться этого. Если бы это было просто byte[], то не было бы проблемы, поскольку это соответствовало бы непосредственно именованному свойству в Агенте, которое может быть указано как @JsonProperty("plan"), но мне как-то нужно сказать Джексону, как обернуть массив в Plan объект. Как этого добиться? Действительно ли требуется специальный сериализатор?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Попробуйте поместить @JsonValue на bytes -метр в классе Plan. Он скажет Джексону, что класс должен быть сериализован с использованием только этого значения. Кроме того, создатель должен быть указан, как показано ниже.

Как это:

class Plan {


  // ...

  @JsonCreator
  public Plan(byte[] bytes) {
    this(bytes, 0);
  }

  @JsonValue
  public byte[] getBytes() {
      return bytes;
  }

  // ...

}
0 голосов
/ 04 сентября 2018

Вы можете аннотировать ваш второй конструктор с помощью @JsonCreator, указав имя поля JSON для отправки в качестве параметра массива byte:

@JsonCreator
public Plan(@JsonProperty("plan") byte[] bytes) {
    this(bytes, 0);
}

Это говорит Джексону использовать этот конструктор, посылая ему значение поля plan объекта JSON.

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